当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Rest控制器中动态设置响应内容类型?

林和畅
2023-03-14

我实现了一个API,它将根据客户的请求返回JSON和XML(即接受请求中的头)。它像预期的那样工作。

这里的问题是:即使用户发送接受标头,在一些特殊情况下(即业务逻辑),我们也需要动态发送响应内容类型。我试图使用HttpHeaders实现它,但它不起作用。

@GetMapping
public ResponseEntity<Response> getQueries(){
...............

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    //headers.add("Content-Type", "application/json");  
    return new ResponseEntity<Response>(response, headers, HttpStatus.OK);
}

我将HTTP状态设置为200,但响应为错误,即,

Unexpected '<'

如何解决这个问题?

共有1个答案

张唯
2023-03-14

你的问题是关于内容协商,这是一种允许消费者(你的用户代理)和提供者(你的控制器)从一开始就同意响应的媒体类型的能力

首先,由APi消费者来指示它将接受哪种媒体类型的响应。这是通过将接受标头设置为所需的类型来完成的。因此,在消费者期望响应类型为JSON的情况下,应该为XML(或每种类型的任何特定变体,例如“应用程序/xhtml xml”等)配置接受标头。

在控制器端,您需要使用“产生”注释属性指定支持的响应媒体类型。还有一个兄弟“消费”属性指定支持的请求媒体类型。所以...我们的映射应该如下所示:

@GetMapping(value="someEndpoint",
        produces={"application/json","application/xml"})
public ResponseEntity<Page<Person>> getPersons(
        @RequestParam(value = "page", required = true) Integer pPage,
        @RequestParam(value = "size", required = true) Integer pSize) 
{
    Page<Person>  result;
    result = personService.getPersons(new PageRequest(pPage, pSize));
    return new ResponseEntity<>(result, HttpStatus.OK);
}

现在有趣的是,您不必为响应格式而烦恼,因为Spring将能够根据超文本传输协议请求接受标头的值检测消费者所需的响应媒体类型。

更好的是,使用正确的配置,您可以在请求中没有接受标头的情况下设置默认响应mediaType。因此,通过将默认响应内容类型设置为“Application/json”,任何没有接受标头的请求都将在JSON中得到服务,而消费者必须添加一个Accep:“Application/xml”才能将响应类型设置为xml。

有关此主题和配置设置的示例和变体,请参阅本Spring指南。

希望这有帮助,

杰克

 类似资料:
  • 问题内容: 因此,我在Struts2中使用freemarker模板来制定我的响应。但是,由于我也尝试使用taconite,因此需要使用“ text / xml”的内容类型发送响应。我似乎找不到使用freemarker指令设置内容类型的方法,而且我对Struts并不精通,无法知道是否有办法通过它来完成。 那么,我应该怎么做呢? 问题答案: 或者您可以在struts.xml中进行设置

  • 我有一个页面,需要动态创建一个iframe并将其粘贴到页面上的div中。我创建iframe的方式如下: 根据某些条件,我需要:A)将iframe src设置为其他页面,或者B)动态地向iframe添加一些HTML。 我有选项A的罚款,但选项B抛出了安全错误: 在尝试设置HTML之前,是否需要在动态iframe上设置?我怎么会那么做呢?有没有更简单的方法将动态内容附加到动态iframe中? 提前道谢

  • 问题内容: 谈话很便宜,请先显示我的代码: HTML: 指示: }); 控制器: 现在工作了,当我单击加号图标时,浏览器控制台输出“添加”。 但我想将控制器动态设置为指令,如下所示: HTML: 控制器: 指令喜欢: 如何实现我的目标?感谢您的回答! 问题答案: 现在可以使用AngularJS。在指令中你只需要添加两个新的属性叫 ,财产,也正好在这里需要。 指令中要注意的重要事项 设置指令动态控制

  • 问题内容: 我在注释驱动的Spring MVC Java Web应用程序中运行在Jetty Web服务器上运行(当前在Maven Jetty插件中)。 我正在尝试使用一种仅返回String帮助文本的控制器方法来提供一些AJAX支持。资源采用UTF-8编码,字符串也采用UTF-8编码,但是我来自服务器的回复是 即使我的浏览器发送 我正在以某种方式使用spring的默认配置 我发现了将这个bean添加

  • 问题内容: 我在注释驱动的Spring MVC Java Web应用程序中运行在Jetty Web服务器上运行(当前在Maven Jetty插件中)。 我正在尝试使用一种仅返回String帮助文本的控制器方法来提供一些AJAX支持。资源采用UTF-8编码,字符串也采用UTF-8编码,但是我来自服务器的回复是 即使我的浏览器发送 我正在以某种方式使用spring的默认配置 我发现了将这个bean添加

  • 我在请求处理程序周围编写了一种包装器,使它们流式传输HTTP响应。我现在得到的是 处理程序响应包装器: 控制器: 我所做的只是每隔半秒发送一个空字符串,以保持请求的活动状态。某些工具需要在超时时不关闭它。这里的问题是,我在响应中没有看到任何内容类型头。尽管我从我的控制器方法返回ResponseEntity,但什么都没有,正如这条线程中所说: https://github.com/spring-pr