REST请求与响应中Content-Type头部相关问题咨询
请求头里的Content-Type只用来标识当前请求的请求体的内容类型,和期望的响应类型完全无关。
比如你发POST创建资源的请求,请求头带Content-Type: application/json,就是告诉服务端「我这次发的请求体是JSON格式,你要用JSON解析器来读内容」,示例请求片段:
POST /my-app/resources HTTP/1.1
Host: example.com
Content-Type: application/json{"name": "test", "value": 123}
如果你的请求没有请求体(比如标准GET请求),那请求头里加Content-Type是完全没有意义的,服务端一般会直接忽略这个字段。另外补充规范提示:标准HTTP协议不推荐GET请求携带请求体,绝大多数网关、反向代理、服务端框架会默认丢弃GET请求的请求体,如果你需要发送JSON格式的请求参数,建议换成POST、PUT等支持请求体的请求方法。
存在专门用来指定期望响应内容类型的请求头,就是Accept头。
你希望服务端返回JSON的话,就在请求头里加Accept: application/json,服务端收到后会优先返回JSON格式的响应,如果服务端不支持返回JSON,会返回406 Not Acceptable状态码。
示例带Accept头的GET请求片段:
GET /my-app/resources HTTP/1.1
Host: example.com
Accept: application/json
你还可以指定多个优先级的响应类型,比如Accept: application/json, text/plain;q=0.9, */*;q=0.8,就是告诉服务端优先返回JSON,不行就返回纯文本,实在不行返回任意格式都可以。
响应一定会携带Content-Type响应头来标识响应体的内容类型,没有其他专用头替代这个作用。
比如你发了带Accept: application/json的GET请求,服务端正常返回JSON的话,响应示例片段:
HTTP/1.1 200 OK
Content-Type: application/json[{"id":1,"name":"test"},{"id":2,"name":"test2"}]
如果服务端返回的是错误信息的HTML页面,那响应头会是Content-Type: text/html; charset=utf-8,你可以通过读取这个头的内容,提前判断怎么解析响应体,避免解析错误。
内容的提问来源于stack exchange,提问作者Aliuk

