【问题标题】:Content-type and @ResponseBody in spring春季的内容类型和@ResponseBody
【发布时间】:2016-12-09 06:01:26
【问题描述】:

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

我在restcontroller 中使用@ResponseBody 将String 值返回给浏览器。浏览器成功接收到响应字符串。

即:

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

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

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

【问题讨论】:

  • 你试过了吗?produce="text/plain"..它可能会有所帮助。

标签: java spring spring-mvc spring-restcontroller


【解决方案1】:

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

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

但是,这不是一个有效的 Json 字符串,您必须更改它,因为您提交的方法将返回空正文。提交的示例将是有效的文本/纯文本。

当请求包含 header "Accept: application/json" 并且返回其他内容类型时,Spring 返回 Json 类型的响应,说明抛出了 HttpMediaTypeNotAcceptableException

关于 servlet 类比 - 请解释一下,我不完全理解你的意思。字符串作为响应正文返回,它与请求属性非常不同。你想达到什么目标?

【讨论】:

    【解决方案2】:

    我假设内容类型将是纯文本/文本。如果请求将接受设置为“application/json”,则取决于您的浏览器/工具。大多数休息客户端不会显示它,因为它不是应用程序/json。如果您直接调用 API,我会假设它是由于浏览器内容嗅探而显示的(可以通过标题禁用)。

    【讨论】:

    • 感谢您的回答。再澄清一点,写在响应正文中意味着在响应中设置键/值对..(类似于在响应中设置属性)
    • 您可以创建一个 JSONObject 并使用 toString(),使用像 jackson 这样的映射器框架,或者创建一个像 "{\"key\":\"value\"}" 这样的字符串跨度>
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2014-10-21
    • 2017-10-06
    • 2016-01-04
    • 2011-04-06
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多