>记录,避免重复造轮子。
我们使用 Httpclient 时常用的请求有2个,HttpPost 和 HttpGet,一般 HttpPost 对传参 Json 的处理是:
```java
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
```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(); }
}
```
然后写发送请求的方法:
```java
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.

HttpDelete携带json参数(body)的方法