背景:在通过httpclient为基础封装http协议接口测试工具类时,遇到get/del接口需要提交携带body(json)格式数据作为参数,但是HttpGet/HttpDelete不支持setEntity()方法不能像HttpPost那样通过setEntity()携带body(json类型)提交参数。在分析了HttpPost后,对比如下:HttpPost 继承了HttpEntityEnclosingRequestBase 类,HttpEntityEnclosingRequestBase此类继承HttpRequestBase同时还实现了setEntity()方法。而HttpGet/HttpDelete只继承HttpRequestBase并未实现setEntity().因此无法设置HttpEntity对象。
解决方案:重写一个MyHttpDelete/MyHttpGet类,继承自HttpEntityEnclosingRequestBase,覆盖其中的getMethod方法,从而返回DELETE/GET。
/**
* 重写httpGet支持body提交
*/
public class MyHttpGet extends HttpEntityEnclosingRequestBase {
public static final String METHOD_NAME = "GET";
@Override
public String getMethod() {
return METHOD_NAME;
}
public MyHttpGet(final String uri) {
super();
setURI(URI.create(uri));
}
public MyHttpGet(final URI uri) {
super();
setURI(uri);
}
public MyHttpGet() {
super();
}
}
使用:
MyHttpGet httpGet = new MyHttpGet(url);
// 创建请求内容
StringEntity entity = new StringEntity(params, ContentType.APPLICATION_JSON);
httpGet.setEntity(entity); // 执行http请求
response = httpClient.execute(httpGet);