我正在编写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语句上加了一个断点。阻止,但是当我在调试下运行它时它从未跳过。
谁能告诉我绊倒的地方?
答案 0 :(得分:1)
默认情况下,RestTemplate
使用标准JDK HttpURLConnection
HTTP客户端发出请求。此客户端不支持PATCH
方法。您可以将RestTemplate
配置为通过客户端工厂使用其他HTTP客户端,例如HttpComponentsClientHttpRequestFactory
或OkHttpClientHttpRequestFactory
。
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>