当前位置: 首页 > 面试题库 >

Spring Boot Controller内容协商

施俊明
2023-03-14
问题内容

我在Spring-boot应用程序中编写了一个简单的REST控制器,但是我不确定如何实现内容协商以使其基于请求标头中的Content-
Type参数返回JSON或XML。有人可以告诉我,我在做什么错?

控制器方式:

@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
  public Message getMessageXML(@RequestParam("text") String text) throws Exception {
    Message message = new Message();
    message.setDate(new Date());
    message.setName("Test");
    message.setAge(99);
    message.setMessage(text);

    return message;
  }

调用此方法时,我总是会得到JSON(即使我Content-Type将be 指定为application/xmltext/xml)。

当我实现两个具有不同映射和不同内容类型的方法时,我可以从xml中获取XML,但是如果我在一个方法中指定两个mediaType(如提供的示例),则该XML不起作用。

我想要的是呼叫\message端点并接收

  • GET请求的Content-Type设置为application / xml时的XML
  • 内容类型为application / json时的JSON

任何帮助表示赞赏。

编辑:我更新了我的控制器以接受所有媒体类型

@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }, consumes = MediaType.ALL_VALUE)
  public Message getMessageXML(@RequestParam("text") String text) throws Exception {
    Message message = new Message();
    message.setDate(new Date());
    message.setName("Vladimir");
    message.setAge(35);
    message.setMessage(text);

    return message;
  }

问题答案:

您可以在第6点的带有Produces和Consumes的博客帖子@RequestMapping中找到一些提示。

请注意有关Content-Type和Accept标头的部分:

带有Produces和Consumes的@RequestMapping:我们可以使用标头Content-
Type和Accept来查找请求内容以及响应中想要的mime消息是什么。为了清楚起见,@
RequestMapping提供产生和使用变量,我们可以在其中指定将为其调用方法的请求内容类型以及响应内容类型。例如:

@RequestMapping(value="/method6",

produces={“application/json”,”application/xml”}, consumes=”text/html”)
@ResponseBody
public String method6(){
return “method6”;
}

上面的方法只能使用Content-Type为text / html的消息,并且能够产生application / json和application /
xml类型的消息。

您也可以尝试使用这种不同的方法(使用ResponseEntity对象),该方法允许您找出传入的消息类型并生成相应的消息(还利用@ResponseBody批注)



 类似资料:
  • Apache支持HTTP/1.1规范中定义的内容协商,它可以根据浏览器提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现方式。它还实现了一些对浏览器发送不完整内容协商信息进行智能处理的能力。 内容协商由mod_negotiation模块支持,并被默认编译进服务器。 关于内容协商(Content Negotiation) 一个资源可能会有多种不同的表现形式,比如,可能会有不同语言或者媒

  • You can configure how Spring MVC determines the requested media types from the request. The available options are to check the URL path for a file extension, check the "Accept" header, a specific quer

  • 主要内容:关于内容协商Apache HTTPD支持规范中描述的内容协商。它可以根据浏览器提供的媒体类型,语言,字符集和编码首选项,选择资源的最佳表示形式。它还实现了一些功能,可以更智能地处理来自发送不完整协商信息的浏览器的请求。 内容协商由模块提供,该模块默认编译。 关于内容协商 资源可以以多种不同的表示形式提供。例如,它可能以不同语言或不同媒体类型或组合形式提供。选择最合适选择的一种方法是为用户提供索引页面,然后让他

  • 内容协商是基于客户端或服务器偏好选择多种可能的表示之一以返回客户端的过程。 确定接受的渲染器 REST framework 根据可用的渲染器,每个渲染器的优先级以及客户端的 Accept: header,使用简单的内容协商风格来确定应将哪些媒体类型返回给客户端。所使用的风格部分由客户端驱动,部分由服务器驱动。 更具体的媒体类型优先于较不特定的媒体类型。 如果多种媒体类型具有相同的特性,则优先根据为

  • 我正在重写旧的rest api,需要保持与它的兼容性。旧api使用servlet并适用于xml和json。逻辑如下: 它检查“Content Type”标题,如果支持(“text/xml”、“application/xml”、“application/json”),则按原样使用 如何使用Spring MVC(使用Spring Boot)获得相同的结果?我尝试在config类中重写configure

  • ContentNegotiatingViewResolver自己并不会解析视图,而是委托给其他的视图解析器去处理。 The ContentNegotiatingViewResolver does not resolve views itself but rather delegates to other view resolvers, selecting the view that resembl