当前 Hutool 5.8.1 可使用如下代码去发起 Patch 请求
import cn.hutool.http.*; HttpRequest request = HttpUtil.createRequest(Method.PATCH, url); request.body(pathBody); HttpResponse response = request.execute();
但实际请求会偶现如下错误
Caused by: cn.hutool.http.HttpException: Invalid HTTP method: PATCH at cn.hutool.http.HttpConnection.setMethod(HttpConnection.java:131) ~[hutool-all-5.8.1.jar!/:na] at cn.hutool.http.HttpRequest.initConnection(HttpRequest.java:1158) ~[hutool-all-5.8.1.jar!/:na] at cn.hutool.http.HttpRequest.doExecute(HttpRequest.java:1121) ~[hutool-all-5.8.1.jar!/:na] at cn.hutool.http.HttpRequest.execute(HttpRequest.java:1012) ~[hutool-all-5.8.1.jar!/:na] at cn.hutool.http.HttpRequest.execute(HttpRequest.java:988) ~[hutool-all-5.8.1.jar!/:na] Caused by: java.net.ProtocolException: Invalid HTTP method: PATCH at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:440) ~[na:1.8.0_111] at sun.net.www.protocol.http.HttpURLConnection.setRequestMethod(HttpURLConnection.java:552) ~[na:1.8.0_111]
原因分析

如上图所示,Hutool 在设置请求类型为 Patch 时会调用 HttpURLConnection#setRequestMethod 方法(如下图所示),而该方法内部并不支持 Patch。若执行 Patch 请求,则会抛出上文提到的异常。但 Hutool 这里通过反射修改 HttpURLConnection.methods 静态变量值将“PATCH”加入其中,以此尝试解决该问题。

但这种方式偶现失败,原因未知 https://gitee.com/dromara/hutool/issues/I3Z3DH
解决
可通过 HttpClient 或其他工具完成 Patch 请求,如下我们在 SpringBoot 项目中使用 RestTemplate 替代 Hutool HttpUtil
import org.springframework.http.*; import org.springframework.web.client.RestTemplate; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> entity = new HttpEntity<>(pathBody, headers); ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(url, HttpMethod.PATCH, entity, JSONObject.class);
本文参考
- “HttpURLConnection Invalid HTTP method: PATCH”:https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch
- “Invalid HTTP method: PATCH”:https://gitee.com/dromara/hutool/issues/I3Z3DH
发表评论