spring 中的内容类型和@ResponseBody

Content-type and @ResponseBody in spring

它可能很简单,但对我理解会很有帮助...

我在我的 restcontroller 中使用了@ResponseBody 来 return 浏览器的字符串值。响应字符串在浏览器中成功接收。

即:

@RequestMapping(value="/foo", method=RequestMethod.GET)
@ResponseBody
public String foo() {
    return "bar";
}

以上响应的内容类型是什么?如果这就像在 servlet 响应中编写 setAttribute 一样,属性名称是什么?

如果浏览器只接受 "application/json" spring 将如何处理响应?

我假定内容类型为 plain/text。如果请求将接受设置为 "application/json",则取决于您的 browser/tool。大多数其他客户端不会显示它,因为它不是 application/json。如果您直接调用 API,我会假设它是由于浏览器内容嗅探而显示的(可以通过 header 禁用)。

提交的代码生成 text/html,默认情况下所有映射的控制器方法也是如此。如果要生成 application/json,则必须将 RequestMapping 更改为

@RequestMapping(value="/foo", method=RequestMethod.GET, produces = "application/json")

然而,这不是有效的 Json 字符串,您必须更改它,因为您提交的方法会 return 为空 body。提交的示例将有效 text/plain.

当请求包含 header "Accept: application/json" 且其他内容类型为 returned 时,Spring returns Json-type 响应说明HttpMediaTypeNotAcceptableException 被抛出。

关于 servlet 类比 - 请解释,我不完全理解你的意思。 String returned 作为响应 body,它与请求属性有很大不同。你想达到什么目的?