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

restTemplate.exchange()方法是什么?

东方富
2023-03-14

实际上,rest模板的作用是什么。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());
}

共有3个答案

充修能
2023-03-14

更通用的交换API需要一个Httpmethod参数和一个请求对象来保证完整性。比较:

ResponseEntity<Foo> response = 
restTemplate.exchange(url, HttpMethod.GET, request, Foo.class);

ResponseEntity<Foo> response = 
restTemplate.getForEntity(url, Foo.class);
燕砚文
2023-03-14

TL; DR:问:请求-响应对叫什么?答:“交换”。

几乎顺便说一句,在HTTP的官方技术文档中使用术语交换来指代结合了相应响应的HTTP请求

然而,从以下问题的答案来看,很明显,虽然这可能代表了一些人事实上的标准,但其他许多人并不知道,或者没有采用。

  • 什么是请求-响应对
  • HTTP请求-响应的名称

文档中没有提到这个名字的词源——可能假设它是显而易见的。

但是,请注意,列出了许多不同的RESTTemplateHTTP请求方法,其中只有一小部分被命名为exchange。该列表主要由特定于HTTP方法的名称组成,如deleteputgetForEntitypostForObject,等等。从技术上讲,所有这些方法都执行相同意义上的交换,但更为集中的便利方法仅限于可能的交换功能和参数返回类型的特定子集。

简单地说,一组Exchange函数是由RestTem板提供的最通用/功能最强的方法,因此当其他方法都没有提供足够完整的参数集来满足您的需求时,您可以使用Exchange...

例如:

  • 使用restTemplate发送带有身份验证头的GET请求,其中OP注意到“…发送诸如accept和Authorization等头的唯一方法是使用exchange方法…”
鞠修雅
2023-03-14

留档的方法很简单:

对给定的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头
  • 给定的URL包含一个模板变量({id})。它将替换为最后一个方法参数(id)中给定的值
  • 将返回响应实体​ 作为字节[]包装到响应属性实例中
 类似资料:
  • Mocking resttemplate.exchange()不起作用。restTemplate.exchange()mocking的响应在BDS适配器类中给出null值。我的测试用例由于BDSAdapter类中的空指针异常而失败。(response.getStatusCodeValue()提供空指针异常。.mockito提示) 未使用...->at com..policydetails_adap

  • 当我使用基于Eclipse的Spring套件在Sprint引导时试图运行示例程序时,我看到了一条错误消息。我在当前使用的mac中安装了JDK11 当url是字符串时。由于该方法需要URI对象,所以我更改了代码。同样在寻找解决方案时,我也将null参数转换为对象。

  • 无法找出正确的方法来使用匹配器来识别我要处理的exchange方法的重载。我正在打的电话:

  • 问题内容: 我一直在试图理解真正的含义: 内联函数 在C ++中,是在类声明中定义的成员函数。(2)编译器用该函数的实际代码替换的函数调用。关键字inline可用于提示编译器对成员或非成员函数的主体执行内联扩展。 排队 在编译过程中用函数代码的副本替换函数调用。 例如,它写成类似: 当方法为最终方法时,可以内联。 此处:http : //www.roseindia.net/javatutorial

  • 问题内容: 如果String对象是不可变的(因此显然不能改变其长度),为什么要使用方法而不是简单地像数组中那样呢? 它仅仅是一个getter方法,还是进行某种计算? 只是想看看背后的逻辑。 问题答案: Java是一种标准,而不仅仅是一种实现。只要遵守标准,不同的供应商就可以以不同的方式许可和实现Java。通过对字段进行标准调用,这毫无理由地严重限制了实现。 而且,就类的未来而言,方法要灵活得多。除

  • 问题内容: 我下面有这个简单的程序 请注意,我使用的是值,而不是指针。但是sync包的页面指定,和函数采用。 为什么/如何运作? 问题答案: 的设定方法的是空的方法集: 输出(在Go Playground上尝试): 这是因为所有方法都具有指针接收器,因此它们都是该类型的方法集的一部分。 当您这样做时: 这实际上是的简写,等等。 这是在规范中:致电: 如果是可寻址且方法集包含,则为的简写。 因此,当