gpt4 book ai didi

java - Spring Boot Controller 内容协商

转载 作者:太空狗 更新时间:2023-10-29 22:49:29 26 4
gpt4 key购买 nike

我有一个用 Spring-boot 应用程序编写的简单 REST Controller ,但我不确定如何实现内容协商以使其根据请求 header 中的 Content-Type 参数返回 JSON 或 XML。有人可以向我解释一下,我做错了什么吗?

Controller 方法:

@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 指定为 application/xmltext/xml ).

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

我想要的是调用\message端点并接收

  • 当GET请求的Content-Type设置为application/xml时的XML
  • 当 Content-Type 为 application/json 时为 JSON

感谢任何帮助。

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

@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;
}

最佳答案

您可以使用 ContentNegotiationConfigurer

首先,您应该重写配置类中的 configureContentNegotiation 方法:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false).
favorParameter(true).
defaultContentType(MediaType.APPLICATION_JSON).
mediaType("xml", MediaType.APPLICATION_XML);
}
}

favorParameter(true) - 在参数或接受 header 上启用偏好路径表达式。

defaultContentType(MediaType.APPLICATION_JSON) - 设置默认内容类型。这意味着如果您不传递路径表达式,那么 Spring 将生成 JSON 作为响应。

mediaType("xml", MediaType.APPLICATION_XML) - 设置 XML 的路径表达式键。

现在,如果你像这样声明你的 Controller :

@Controller
class AccountController {

@RequestMapping(value="/accounts", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<Account> list(Model model, Principal principal) {
return accountManager.getAccounts(principal) );
}
}

并将其命名为localhost:8080/app/accounts.json,然后 Spring 将生成 JSON 作为响应。因此,如果您调用 localhost:8080/app/accounts.xml,您将收到 XML 响应

您可以找到关于此的更多信息 here .

关于java - Spring Boot Controller 内容协商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33009918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com