如何实现通过RestTemplate执行的PATCH?

时间:2017-01-09 21:14:46

标签: java rest junit resttemplate http-patch

我正在编写JUnit测试,通过RestTemplate调用我的应用程序。我已经成功实现了GET,POST和PUT,但是无法运行PATCH(尽管它在客户端发送URL时有效)。例如,POST使用以下代码运行:

    RestTemplate restTemplate = new RestTemplate(); 
    ProductModel postModel = restTemplate.postForObject(TestBase.URL + URL, pModel, ProductModel.class);            

但是当我试图调用restTemplate.patchForObject()时 - 我在网上找到了它 - STS返回一个错误,说明函数没有定义。因此我使用了这个:

    RestTemplate restTemplate = new RestTemplate(); 
    ResponseEntity<MessageModel> retval = restTemplate.exchange("http://localhost:8080/products/batchUpdateProductPositions", 
            HttpMethod.PATCH, new HttpEntity<ProductPositionListModel>(pps), MessageModel.class);   

编译,但给我一个错误:

I/O Error on PATCH request for "http://localhost:8080/products/batchUpdateProductPositions": Invalid HTTP method: PATCH

在应用程序中,我在Controller类中定义了操作:

@RequestMapping(value = "/batchUpdateProductPositions", method = RequestMethod.PATCH)
public MessageModel batchUpdatePosition(
        @RequestBody ProductPositionListModel productPositionList)
        throws Exception {
    try {
        return productService.batchUpdatePosition(productPositionList);
    } catch (Exception e) {

我在&#39;尝试&#39;里面的return语句上加了一个断点。阻止,但是当我在调试下运行它时它从未跳过。

谁能告诉我绊倒的地方?

5 个答案:

答案 0 :(得分:1)

默认情况下,RestTemplate使用标准JDK HttpURLConnection HTTP客户端发出请求。此客户端不支持PATCH方法。您可以将RestTemplate配置为通过客户端工厂使用其他HTTP客户端,例如HttpComponentsClientHttpRequestFactoryOkHttpClientHttpRequestFactory

HttpClient client = HttpClients.createDefault();
RestTemplate template= new RestTemplate();
template.setRequestFactory(new HttpComponentsClientHttpRequestFactory(client)); 

您还需要添加适当的依赖项,例如org.apache.httpcomponents:httpclient:$version,以防HTTP组件客户端。

答案 1 :(得分:1)

我发现了一个与JUnit代码的其余部分保持一致的解决方案。使用postForObject(),您可以传递在这种情况下所需的HTTP方法:

    MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch", 
            pps, MessageModel.class);           

这正确运行。不能说是否有副作用,我没有注意到。

答案 2 :(得分:0)

此解决方案

MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch",pps, MessageModel.class);   

如果您使用的是Post方法(@PostMapping),则非常有用,如果您想使用Patch Method(@PatchMapping),请试试这个:

restTemplate.patchForObject("http://localhost:8080/products/batchUpdateProductPositions", requestEntity, String.class);

答案 3 :(得分:0)

这适用于我,使用RestTemplate执行PATCH请求:

RestTemplate restTemplate = new RestTemplate();

HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectTimeout(timeout);
httpRequestFactory.setReadTimeout(timeout);

restTemplate.setRequestFactory(httpRequestFactory);

现在将此restTemplate与exchange()一起使用。

必需的依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency> 

答案 4 :(得分:0)

尝试一下:

import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
//...
RestTemplate rest = new RestTemplate(new HttpComponentsClientHttpRequestFactory())

//Now make the PATCH call using Exchange
ResponseEntity<Map<String, Object>> response = rest.exchange(api, HttpMethod.PATCH, request, responseType);

不要忘记将其添加到您的依赖项中:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4.1</version>
 </dependency>