实际上restTemplate.exchange()
方法做了什么?
@RequestMapping(value = "/getphoto", method = RequestMethod.GET)
public void getPhoto(@RequestParam("id") Long id, HttpServletResponse response) {
logger.debug("Retrieve photo with id: " + id);
// Prepare acceptable media type
List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.IMAGE_JPEG);
// Prepare header
HttpHeaders headers = new HttpHeaders();
headers.setAccept(acceptableMediaTypes);
HttpEntity<String> entity = new HttpEntity<String>(headers);
// Send the request as GET
ResponseEntity<byte[]> result =
restTemplate.exchange("http://localhost:7070/spring-rest-provider/krams/person/{id}",
HttpMethod.GET, entity, byte[].class, id);
// Display the image
Writer.write(response, result.getBody());
}
答案 0 :(得分:14)
method documentation非常简单:
对给定的URI模板执行HTTP方法,将给定的请求实体写入请求,并将响应返回为
ResponseEntity
。使用给定的URI变量(如果有)扩展URI模板变量。
考虑从您自己的问题中提取的以下代码:
ResponseEntity<byte[]> result =
restTemplate.exchange("http://localhost:7070/spring-rest-provider/krams/person/{id}",
HttpMethod.GET, entity, byte[].class, id);
我们有以下内容:
GET
请求,发送包含在HttpEntity
实例中的HTTP标头。 {id}
),因此它将替换为上一个方法参数(id
)中给出的值。byte[]
包装到ResponseEntity
实例中返回。答案 1 :(得分:6)
TL; DR: Q: What is a request-response pair called? A:一个“ 交换”。
在the official technical documentation of HTTP中几乎偶然地使用术语 exchange 来指代HTTP请求和相应的响应。
无论如何看待以下问题的答案,很明显,尽管这可能代表了某些人的事实上的标准,但许多其他人并未意识到或没有采用它。
documentation不用理会该名称的词源,可能假设它是显而易见的。
但是,请注意,这里列出了许多不同的RestTemplate HTTP请求方法,其中只有一小部分被命名为 exchange 。该列表主要由HTTP method特定的名称组成,例如.bacpac
,delete
,put
,getForEntity
等。从技术上讲,所有这些方法都在相同的意义上执行交换,但是更加集中的便捷方法仅限于可能的交换功能和参数+返回类型的特定子集。
简而言之,一组postForObject
函数是exchange
提供的最通用/能力最强的方法,因此您可以在没有RestTemplate
时使用其他方法提供的参数集足以满足您的需求。
例如:
答案 2 :(得分:0)
exchange方法针对指定的URI模板执行HTTP方法,传入参数以进行替换。在这种情况下,它为个人实体获取其Id参数的图像,并为其返回字节数组。
答案 3 :(得分:0)
更通用的交换API需要HttpMethod参数和请求对象以确保完整性。比较:
ResponseEntity<Foo> response =
restTemplate.exchange(url, HttpMethod.GET, request, Foo.class);
ResponseEntity<Foo> response =
restTemplate.getForEntity(url, Foo.class);