什么是restTemplate.exchange()方法?

时间:2013-11-25 07:04:51

标签: rest resttemplate

实际上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());
}

4 个答案:

答案 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);

我们有以下内容:

  • 将对给定的URL执行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特定的名称组成,例如.bacpacdeleteputgetForEntity等。从技术上讲,所有这些方法都在相同的意义上执行交换,但是更加集中的便捷方法仅限于可能的交换功能和参数+返回类型的特定子集。

简而言之,一组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);