在实践性能测试框架第二版的过程中,我实现了一个单个HttpRequestBase对象的concurrent对象创建,单之前都是用使用唯一的HttpRequestBase对象进行多线程请求,目前来看是没有问题的,但为了防止以后出现意外BUG和统一concurrent的构造方法使用,故尝试拷贝了一个HttpRequestBase对象。原因是因为之前封装的深拷贝方法对于HttpRequestBase对象的实现类如:httpget和httppost并不适用,因为没有实现Serializable接口。所以单独写了一个HttpRequestBase对象的拷贝方法,供大家参考。
下面是FunRequest
类的代码,深拷贝的静态方法在最后。
package com.fun.frame.httpclient
import com.fun.base.bean.RequestInfoimport com.fun.base.exception.RequestExceptionimport com.fun.config.HttpClientConstantimport com.fun.config.RequestTypeimport net.sf.json.JSONObjectimport org.apache.commons.lang3.StringUtilsimport org.apache.http.Headerimport org.apache.http.HttpEntityimport org.apache.http.client.methods.HttpPostimport org.apache.http.client.methods.HttpRequestBaseimport org.apache.http.util.EntityUtilsimport org.slf4j.Loggerimport org.slf4j.LoggerFactory
/** * 重写FanLibrary,使用面对对象思想 */public class FunRequest extends FanLibrary implements Serializable,Cloneable {
private static final long serialVersionUID = -4153600036943378727L;
static Logger logger = LoggerFactory.getLogger(FunRequest.class)
/** * 请求类型,true为get,false为post */
RequestType requestType
/** * 请求对象 */
HttpRequestBase request
/** * host地址 */
String host
/** * 接口地址 */
String apiName
/** * 请求地址,如果为空则由host和apiname拼接 */
String uri
/** * header集合 */
List<Header> headers = new ArrayList<>()
/** * get参数 */
JSONObject args = new JSONObject()
/** * post参数,表单 */
JSONObject params = new JSONObject()
/** * json参数 */
JSONObject json = new JSONObject()
/** * 构造方法 * * @param requestType */ private FunRequest(RequestType requestType) { this.requestType = requestType }
/** * 获取get对象 * * @return */ static FunRequest isGet() { new FunRequest(RequestType.GET) }
/** * 获取post对象 * * @return */ static FunRequest isPost() { new FunRequest(RequestType.POST) }
/** * 设置host * * @param host * @return */ FunRequest setHost(String host) { this.host = host this }
/** * 设置接口地址 * * @param apiName * @return */ FunRequest setApiName(String apiName) { this.apiName = apiName this }
/** * 设置uri * * @param uri * @return */ FunRequest setUri(String uri) { this.uri = uri this }
/** * 添加get参数 * * @param key * @param value * @return */ FunRequest addArgs(Object key, Object value) { args.put(key, value) this }
/** * 添加post参数 * * @param key * @param value * @return */ FunRequest addParam(Object key, Object value) { params.put(key, value) this }
/** * 添加json参数 * * @param key * @param value * @return */ FunRequest addJson(Object key, Object value) { json.put(key, value) this }
/** * 添加header * * @param key * @param value * @return */ FunRequest addHeader(Object key, Object value) { headers << getHeader(key.toString(), value.toString()) this }
/** * 添加header * * @param header * @return */ public FunRequest addHeader(Header header) { headers.add(header) this }
/** * 批量添加header * * @param header * @return */ FunRequest addHeader(List<Header> header) { header.each {h -> headers << h} this }
/** * 增加header中cookies * * @param cookies * @return */ FunRequest addCookies(JSONObject cookies) { headers << getCookies(cookies) this }
FunRequest setHeaders(List<Header> headers) { this.headers.addAll(headers) this }
FunRequest setArgs(JSONObject args) { this.args.putAll(args) this }
FunRequest setParams(JSONObject params) { this.params.putAll(params) this }
FunRequest setJson(JSONObject json) { this.json.putAll(json) this }
/** * 获取请求响应,兼容相关参数方法,不包括file * * @return */ JSONObject getResponse() { return getHttpResponse(request == null ? getRequest() : request) }
/** * 获取请求对象 * * @return */ HttpRequestBase getRequest() { if (request != null) request; if (StringUtils.isEmpty(uri)) uri = host + apiName switch (requestType) { case RequestType.GET: request = FanLibrary.getHttpGet(uri, args) break case RequestType.POST: request = !params.isEmpty() ? FanLibrary.getHttpPost(uri + changeJsonToArguments(args), params) : !json.isEmpty() ? getHttpPost(uri + changeJsonToArguments(args), json.toString()) : getHttpPost(uri + changeJsonToArguments(args)) break } for (Header header in headers) { request.addHeader(header) } logger.debug("请求信息:{}", new RequestInfo(this.request).toString()) request }
@Override String toString() { JSONObject.fromObject(this).toString() }
@Override FunRequest clone() { def fun = new FunRequest() fun.setRequest(cloneRequest(getRequest())) fun }
static HttpRequestBase cloneRequest(HttpRequestBase base) { String method = base.getMethod(); RequestType requestType = RequestType.getRequestType(method); String uri = base.getURI().toString(); List<Header> headers = Arrays.asList(base.getAllHeaders()); if (requestType == requestType.GET) { return FunRequest.isGet().setUri(uri).setHeaders(headers).getRequest(); } else if (requestType == RequestType.POST || requestType == RequestType.FUN) { HttpPost post = (HttpPost) base; HttpEntity entity = post.getEntity(); String value = entity.getContentType().getValue(); String content = null; try { content = EntityUtils.toString(entity); } catch (IOException e) { logger.error("解析响应失败!", e) fail(); } if (value.equalsIgnoreCase(HttpClientConstant.ContentType_TEXT.getValue()) || value.equalsIgnoreCase(HttpClientConstant.ContentType_JSON.getValue())) { return FunRequest.isPost().setUri(uri).setHeaders(headers).setJson(JSONObject.fromObject(content)).getRequest(); } else if (value.equalsIgnoreCase(HttpClientConstant.ContentType_FORM.getValue())) { return FunRequest.isPost().setUri(uri).setHeaders(headers).setParams(getJson(content.split("&"))).getRequest(); } } else { RequestException.fail("不支持的请求类型!"); }
}
}
- 郑重声明:禁止第三方(腾讯云除外)转载、发表。