@ResponseBody不一定返回json

如题所述

第1个回答  2022-07-18
我们先来公布正确的答案。

@ResponseBody 的输出格式,默认情况取决于客户端的 Accept 请求头。

application/xml | text/xml | application/*+xml

Http报头分为通用报头,请求报头,响应报头和实体报头。
请求方的http报头结构:通用报头|请求报头|实体报头
响应方的http报头结构:通用报头|响应报头|实体报头

比如:Accept:text/xml(application/json);
代表客户端希望接受的数据类型是xml(json )类型
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。

比如:Content-Type:text/html(application/json) ;
代表发送端发送的数据格式是html(json)。
二者合起来,

Accept:text/xml;
Content-Type:text/html

即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。

如果accept指定的类型和response返回的类型不一致,会出现406,not acceptable错误,对应到java spring工程,就是

HttpHeaders headers = new HttpHeaders();

headers.add("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE.toString());

如果head头里加了accept,那么@RequestMapping里的 produces = "*/*" 或 produces = "application/json"

Conteny-Type:内容类型,即请求/响应的内容区数据的媒体类型
Accept:用来指定什么媒体类型的响应是可接受的,即告诉服务器我需要什么媒体类型的数据,此时服务器应该根据Accept请求头生产指定媒体类型的数据。
问题:

服务器端可以通过指定【headers = “Content-Type=application/json”】来声明可处理(可消费)的媒体类型,即只消费Content-Type指定的请求内容体数据;

客户端如何告诉服务器端它只消费什么媒体类型的数据呢?即客户端接受(需要)什么类型的数据呢?服务器应该生产什么类型的数据?此时我们可以请求的Accept请求头来实现这个功能。

上面两个例子都表示了request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json:

produces标识:produces="application/json"
headers = "Accept=application/json"
其中request Content-Type为“application/json”类型的请求.

当你有如下Accept头,将遵守如下规则进行应用:
相似回答