如何实现通过 RestTemplate 执行的 PATCH?
How do I implement a PATCH executed via RestTemplate?
我正在编写 JUnit 测试代码,通过 RestTemplate 调用我的应用程序。我已成功实施 GET、POSTs 和 PUT,但无法获得 运行 的 PATCH(尽管它在客户端发送 URL 时有效)。一个 POST,例如 运行s,代码如下:
RestTemplate restTemplate = new RestTemplate();
ProductModel postModel = restTemplate.postForObject(TestBase.URL + URL, pModel, ProductModel.class);
但是当我尝试调用 restTemplate.patchForObject() - 我在网上找到的 - STS return 是一个错误,指出函数未定义。我因此使用了这个:
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
在应用程序中,我在控制器中定义了操作 class:
@RequestMapping(value = "/batchUpdateProductPositions", method = RequestMethod.PATCH)
public MessageModel batchUpdatePosition(
@RequestBody ProductPositionListModel productPositionList)
throws Exception {
try {
return productService.batchUpdatePosition(productPositionList);
} catch (Exception e) {
我在 'try' 块内的 return 语句上放置了一个断点,但是当我 运行 它在调试时它从未跳闸。
谁能告诉我哪里出错了?
默认情况下 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 组件客户端。
我发现了一个与其余 JUnit 代码保持一致的解决方案。使用postForObject(),你可以在这种情况下传入你需要的HTTP方法:
MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch",
pps, MessageModel.class);
这运行正确。不能说是否有我没有注意到的副作用。
这个解决方案
MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch",pps, MessageModel.class);
如果您使用的是 Post 方法(@PostMapping
),则很有用,如果您想使用补丁方法(@PatchMapping
),请尝试:
restTemplate.patchForObject("http://localhost:8080/products/batchUpdateProductPositions", requestEntity, String.class);
这对我有用,用于使用 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>
试试这个:
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>
我正在编写 JUnit 测试代码,通过 RestTemplate 调用我的应用程序。我已成功实施 GET、POSTs 和 PUT,但无法获得 运行 的 PATCH(尽管它在客户端发送 URL 时有效)。一个 POST,例如 运行s,代码如下:
RestTemplate restTemplate = new RestTemplate();
ProductModel postModel = restTemplate.postForObject(TestBase.URL + URL, pModel, ProductModel.class);
但是当我尝试调用 restTemplate.patchForObject() - 我在网上找到的 - STS return 是一个错误,指出函数未定义。我因此使用了这个:
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
在应用程序中,我在控制器中定义了操作 class:
@RequestMapping(value = "/batchUpdateProductPositions", method = RequestMethod.PATCH)
public MessageModel batchUpdatePosition(
@RequestBody ProductPositionListModel productPositionList)
throws Exception {
try {
return productService.batchUpdatePosition(productPositionList);
} catch (Exception e) {
我在 'try' 块内的 return 语句上放置了一个断点,但是当我 运行 它在调试时它从未跳闸。
谁能告诉我哪里出错了?
默认情况下 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 组件客户端。
我发现了一个与其余 JUnit 代码保持一致的解决方案。使用postForObject(),你可以在这种情况下传入你需要的HTTP方法:
MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch",
pps, MessageModel.class);
这运行正确。不能说是否有我没有注意到的副作用。
这个解决方案
MessageModel pModel = restTemplate.postForObject(TestBase.URL + URL + "/batchUpdateProductPositions?_method=patch",pps, MessageModel.class);
如果您使用的是 Post 方法(@PostMapping
),则很有用,如果您想使用补丁方法(@PatchMapping
),请尝试:
restTemplate.patchForObject("http://localhost:8080/products/batchUpdateProductPositions", requestEntity, String.class);
这对我有用,用于使用 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>
试试这个:
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>