我正在使用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();
}
该应用程序正常。没有例外等。
但我对以下内容感到困惑:
一
如果我在任何网络浏览器中输入网址:
http://localhost:8080/spring-utility/person/2/customized
自动呈现内容的预期方式,但始终采用XML格式。
即使我有:
produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
我假设应首先选择JSON(似乎顺序无关紧要)
无论如何,总是选择XML如何默认。
因此:
两个
根据API HttpHeaders for the method setAccept
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<MediaType>
,所以我决定测试和玩。
如何查看上面显示的代码,我有两个场景
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 因此,我假设第二个被忽略。
如果我是对的,那么
setAccept(List<MediaType> acceptableMediaTypes)
有什么意义?
我的意思是发送List
?答案 0 :(得分:1)
文档说明了一切:
设置可接受的媒体类型列表
因此,如果您将XML和JSON作为可接受的媒体类型发送,并且服务器能够生成至少一种媒体类型,则它将返回成功的响应。如果服务器无法生成任何这些,它将返回错误响应。
这也回答了你的第一个问题:浏览器可能只发送HTML和XML作为可接受的媒体类型。您的服务器无法生成HTML,但能够生成XML,因此返回给浏览器。