记录,避免重复造轮子。
我们使用 Httpclient 时常用的请求有2个,HttpPost 和 HttpGet,一般 HttpPost 对传参 Json 的处理是:
HttpPost httpPost= new HttpPost(url);
post.setEntity(new StringEntity(jsonString));
但 HttpDelete 携带 json 参数时,不支持 setEntity 方法,
其中不支持的原因是: 在 HttpMethods 中,包含 HttpGet, HttpPost, HttpPut, HttpDelete 等类来实现 http 的常用操作。其中,HttpPost 继承自 HttpEntityEnclosingRequestBase,HttpEntityEnclosingRequestBase 类又实现了 HttpEntityEnclosingRequest 接口,实现了 setEntity 的方法。
而 HttpDelete 继承自HttpRequestBase,没有实现 setEntity 的方法,因此无法设置 HttpEntity 对象。
这里解决的方案是:重写一个自己的 HttpDeleteWithBody 类,继承自 HttpEntityEnclosingRequestBase,覆盖其中的 getMethod 方法,从而返回 DELETE。
HttpDeleteWithBody.java
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import java.net.URI;
public class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
public static final String METHOD_NAME = "DELETE";
@Override
public String getMethod() { return METHOD_NAME; }
public HttpDeleteWithBody(final String uri) {
super();
setURI(URI.create(uri));
}
public HttpDeleteWithBody(final URI uri) {
super();
setURI(uri);
}
public HttpDeleteWithBody() { super(); }
}
然后写发送请求的方法:
public static String sendDelete(String url, String jsonStr, String contentType, Map<String, String> headParam) {
CloseableHttpResponse response = null;
String resultString = "";
// 创建Httpclient对象
try (CloseableHttpClient httpClient = HttpClients.createDefault();) {
// 创建HttpDelete请求
HttpEntityEnclosingRequestBase requestBase = new HttpDeleteWithBody(url);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000)
.setConnectionRequestTimeout(30000).setSocketTimeout(30000).build();
requestBase.setConfig(requestConfig);
requestBase.addHeader("Content-type", !(contentType == null || "".equals(contentType)) ? contentType : "application/json;charset=utf-8");
requestBase.setHeader("Accept", "application/json");
packageHeader(headParam, requestBase);
log.info("requestUrl:{}", url);
log.info("requestStr:{}", jsonStr);
// 创建请求内容
if (jsonStr != null) {
StringEntity entity = new StringEntity(jsonStr, ContentType.APPLICATION_JSON);
requestBase.setEntity(entity);
}
long beginTime = System.currentTimeMillis();
// 执行http请求
response = httpClient.execute(requestBase);
log.info("接口耗时:{}", System.currentTimeMillis() - beginTime);
resultString = EntityUtils.toString(response.getEntity(), DEFAULT_CHARSET);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
httpclient maven依赖
<!-- 添加httpClient工具包 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5</version>
</dependency>
End.
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/httpdelete携带json参数body的方法