【问题标题】:Behaviour @RequestMapping's produces through RestTemplate and Web Browser@RequestMapping 的行为通过 RestTemplate 和 Web 浏览器产生
【发布时间】:2014-10-29 05:33:47
【问题描述】:

我正在使用 Spring 4.0.7

我有一个用 JSON 和 XML 表示的实体。

@Entity
@Table(name="person")
@XmlRootElement(name="person")
@XmlType(propOrder = {"id",…,"address"})
public class Person implements Serializable {

我有以下方法:

@RequestMapping(value="/{id}/customized", 
                method=RequestMethod.GET,
                produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<Person> getPersonCustomized(@PathVariable Integer id){
    logger.info("PersonRestResponseEntityController  - getPersonCustomized - id: {}", id);
    Person person = personMapRepository.findPerson(id);
    return new ResponseEntity<>(person, HttpStatus.FOUND);//302     
}

通过 RestTemplate 我可以做到以下几点:

public Person getPersonCustomized(String id, String type){

    HttpHeaders headers = new HttpHeaders();

    if(type.equals("JSON")){
        logger.info("JSON");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    }
    else if(type.equals("XML")){
        logger.info("XML");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
    }
    else if(type.equals("MIX01")){
        logger.info("MIX01 - XML _ JSON");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON));
    }
    else if(type.equals("MIX02")){
        logger.info("MIX01 - JSON _ XML");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
    }

    ResponseEntity<Person> response =
            restTemplate.exchange("http://localhost:8080/spring-utility/person/{id}/customized",
                                  HttpMethod.GET,
                                  new HttpEntity<Person>(headers),  
                                  Person.class,
                                   id
                                 );
    logger.info("status: {}", response.getStatusCode());
    logger.info("body: {}", response.getBody());

    return response.getBody();
}

该应用程序运行良好。没有例外等等。

但我对以下内容感到困惑:

一个

如果我在任何网络浏览器中输入 URL:

  • http://localhost:8080/spring-utility/person/2/customized

它会自动以预期的方式呈现内容,但始终以 XML 格式呈现。

即使我有:

  • produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})

我假设应该首先选择 JSON(似乎顺序无关紧要)

无论如何,总是选择默认的 XML。

因此:

  1. 为什么XML已经被选为默认格式了?

两个

根据API HttpHeaders for the method setAccept

设置接受

public void setAccept(List<MediaType> acceptableMediaTypes)

Set the list of acceptable media types, as specified by the Accept header.

Parameters:
    acceptableMediaTypes - the acceptable media types

它有一个List&lt;MediaType&gt;,所以我决定测试和玩。

通过我上面显示的代码怎么看,我有两种情况

  • headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON));
  • headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));

每一个代表的地方

  • Accept=application/xml, application/json
  • Accept=application/json, application/xml

通过 RestTemplate 我总是可以看到 Person 对象已经转换或转换,所以没有什么新东西

因此,只是玩Poster

如果我设置标题值

  • Accept=application/xml, application/json 那么响应是 XML 格式
  • Accept=application/json, application/xml那么响应是 JSON 格式

因此,我假设第二个被忽略。

如果我是正确的,那么

  1. setAccept(List&lt;MediaType&gt; acceptableMediaTypes) 的意义何在? 我的意思是发送List
  2. 如果我们发送一个列表,有什么意义有用应该有效?。
  3. 当我们发送接受列表时,预期的行为是什么?

【问题讨论】:

    标签: spring spring-mvc spring-3 spring-4


    【解决方案1】:

    文档说明了一切:

    设置可接受的媒体类型列表

    因此,如果您将 XML 和 JSON 作为可接受的媒体类型发送,并且服务器能够生成至少其中一种媒体类型,它将返回成功的响应。如果服务器无法生成其中任何一个,它将返回错误响应。

    这也回答了您的第一个问题:浏览器可能只发送 HTML 和 XML 作为可接受的媒体类型。您的服务器无法生成 HTML,但能够生成 XML,所以这就是返回给浏览器的内容。

    【讨论】:

    • 关于网络浏览器,当我在@RequestMapping 方法中使用参数@RequestHeader String accept 时,我确实意识到Console(通过SLF4j)显示accept: application/xml, text/xml, application/json, application/*+xml, application/*+json,列表的第一个是@ 987654325@ 可以回答为什么所有的网络浏览器都有这种行为
    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多