【问题标题】:Why does Spring MVC prefer to serve application/json types over anything else?为什么 Spring MVC 更喜欢提供 application/json 类型而不是其他任何东西?
【发布时间】:2012-11-04 04:41:57
【问题描述】:

给定以下 Spring 代码:

@Controller
@RequestMapping("/somepath")
public class SomeService {
    @RequestMapping(headers = "Accept=application/json")
    public ReturnType methodOne() {
        // stuff
    }

    @RequestMapping(headers = "Accept=text/html")
    public ReturnType methodTwo() {
        // stuff
    }
}

我注意到,当客户端根本不包含“Accept”标头时,总是优先调用“application/json”方法而不是 text/html 方法。我的问题是——为什么?它们之间没有什么可以选择的,那么为什么更喜欢其中一个呢?我本来希望看到一条错误消息...

一个具体的例子:

@RequestMapping("/somepath")
@Controller
public class SomeService {

    @ResponseBody
    @RequestMapping(headers = "Accept=application/json")
    public ResponseEntity<String> methodOne() {
        return new ResponseEntity<String>("Method One", HttpStatus.OK);
    }

    @ResponseBody
    @RequestMapping(headers = "Accept=text/html")
    public ResponseEntity<String> methodTwo() {
        return new ResponseEntity<String>("Method Two", HttpStatus.OK);
    }

    @ResponseBody
    @RequestMapping(headers = "Accept=application/xml")
    public ResponseEntity<String> methodThree() {
        return new ResponseEntity<String>("Method Three", HttpStatus.OK);
    }
}

如果没有接受标头,则始终输出“方法一”。

【问题讨论】:

  • 因为通常api旨在让数据在客户端服务器之间传输。 json 是一种数据格式,而 html 仅用于显示。
  • 有趣的一点 - 我通过为 application/xml 接受标题添加另一个带有 RequestMapping 的方法来测试,因为应该没有理由选择 json 版本(反之亦然),但我仍然每次都得到 json 版本。
  • @AndyB 返回类型由请求类型决定。
  • 但这就是我要说明的重点 - 如果我不设置接受标头,则 没有请求类型。

标签: json web-services spring-mvc


【解决方案1】:

春天不喜欢任何东西。它可以返回您指定的任何内容(pdf、xml 等)

但是,由于视图经常使用 javascript 和 ajax 与控制器交互,因此通常实现 JSON。哪种数据格式最适合 javascript 使用:JSON。

【讨论】:

  • Hmmm.... 这似乎不太正确,但是...在我的示例(或周围的配置)中没有代码来设置任何特定的 JSON 视图。你所看到的就是我所拥有的——但它每次都会在没有任何其他信息的情况下使用 application/json 方法。
  • @AndyB 什么不是真的?您已将代码设置为使用 JSON。我不知道你的观点是做什么的。发布的方法无论如何都不会返回任何数据。但我的观点是,客户端/视图在 Web 应用程序中使用 javascript 访问 JSON 格式的数据很常见,这可以解释为什么你错误地说“spring 更喜欢 json”。
  • 除非我真的误解了我正在做的事情,否则我认为不会涉及到观点。我在我的问题中添加了一个更具体的例子——你看到的是整个代码。我正在使用直接通过 HTTP 访问服务的 Java REST 客户端对此进行测试,如果我没有设置接受标头,我总是得到“方法一”作为响应 - 我仍然看不到发生了什么会导致这种行为。
  • 而不是 headers = "Accepts" 等 do consumes="application/json",可能会解决您的问题。
  • @AndyB 好的,这是有道理的,我现在明白了。但恐怕我没有答案。它甚至可以简单地调用第一个声明的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 2011-03-24
相关资源
最近更新 更多