欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用ASP.NET Core 3.x 构建 RESTful API - 3.4 内容协商

程序员文章站 2022-08-28 16:40:23
现在,当谈论起 RESTful Web API 的时候,人们总会想到 JSON。但是实际上,JSON 和 RESTful API 没有半毛钱关系,只不过 JSON 恰好是RESTful API 结果的表述格式。也就是说 RESTful API 还可以使用其它的表述格式,例如 xml 或私有的格式。这 ......

现在,当谈论起 restful web api 的时候,人们总会想到 json。但是实际上,json  restful api 没有半毛钱关系,只不过 json 恰好是restful api 结果的表述格式。也就是说 restful api 还可以使用其它的表述格式,例如 xml 或私有的格式。这也就意味着,我们需要让 restful api 知道我们想要返回的格式。而这就是http请求和响应的核心内容之一: 

 

content negotiation 内容协商 

内容协商是这样一个过程:针对一个响应,当有多种表述格式可用的时候,选取最佳的一个表述。 

 

当我们的restful api只面向一个api消费者的时候,也许只使用 json 一种格式是没有什么问题的。但是如果需要面向各种形式的多个api消费者,那么很有可能少数api消费者无法很好的解析json,它们可能更习惯于xml或者其它格式。 

 

那么如何解决这个问题呢? 

http请求的 accept header 就是用来解决这个问题的,api的消费者在发送请求的时候,在accept header 里面填写好 media type(媒体类型),例如 application/json 或者 application/xml等等。 

如果请求里填写的是 application/json,那么restful api返回响应的表述格式就应该是 json 

 

而如果请求没有填写 accept header,那么 restful api 只好使用它的默认格式进行响应了。 

如果在 accept header 里面填写的格式不被 restful api 所支持,那么倒是也可以返回默认的格式,但还是要尽量避免这种情况的出现,其实针对这种情况最好的办法是返回 406not acceptable 状态码,表示 api消费者请求的媒体类型是不可接受的,无法将其作为响应的格式。 

 

综上,accept header 指的是输出格式。 

 asp.net core 里面对应的就是 output formatters 

 

而用于指定输入格式的 header content-type,在 asp.net core 里面对应的就是 input formatter 

例如 post 请求的 body 就需要通过指定 content-type 来进行标识,这个 header 可以看作是自描述性这个约束的一部分(每个消息必须包含足够的信息来知道如何对它进行处理)。