使用httpclient构造http/https客户端
来源:互联网 发布:天津seo网络优化公司 编辑:程序博客网 时间:2024/04/28 02:58
目前接口测试使用jmeter工具配置服务器IP、端口号、协议、url路径、请求方法、请求参数,参考jmeter的设计我们可以用编程语言自己实现一个客户端,本文主要讲一下使用httpclient构造http/https客户端的代码实现。
1.公共请求参数类,主要包括IP、端口号、协议、所有请求组成的链表
import java.util.List;/** * ClassName: RequestParameter * * @author xiezhaoqing192 * @date 2016年4月26日 */public class RequestParameter { private String host; private int port; private String protocol; private List<BasicParameter> basparams; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getProtocol() { return protocol; } public void setProtocol(String protocol) { this.protocol = protocol; } public List<BasicParameter> getBasparams() { return basparams; } public void setBasparams(List<BasicParameter> basparams) { this.basparams = basparams; }}
2.具体的请求参数类
import java.util.HashMap;import java.util.Map;/** * ClassName: BasicParameter * * @author xiezhaoqing192 * @date 2016年4月26日 */public class BasicParameter { private String apiUrl; private String method; private Map<String,String> paramters=new HashMap<String,String>(); private String uniqueid; private Map<String,String> fileList=new HashMap<String,String>(); //新增逻辑,支持后置处理器 2016.05.20 by djj private Map<String,String> afterCatch=new HashMap<String,String>(); /** * 默认构造函数 * @param String apiUrl,String method,String uniqueid * @return N/A * @throws N/A */ public BasicParameter(String apiUrl,String method,String uniqueid){ this.apiUrl=apiUrl; this.method=method; this.uniqueid=uniqueid; } public String getApiUrl() { return apiUrl; } public void setApiUrl(String apiUrl) { this.apiUrl = apiUrl; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Map<String,String> getParamters() { return paramters; } public void addParamters(String key,String value) { paramters.put(key, value); } public void addFile(String key,String value) { fileList.put(key, value); } public void addAfterCatch(String key,String value) { afterCatch.put(key, value); } public String getUniqueid() { return uniqueid; } public void setUniqueid(String uniqueid) { this.uniqueid = uniqueid; } public Map<String,String> getAfterCatch() { return afterCatch; } /** * @return the fileList */ public Map<String,String> getFileList() { return fileList; } /** * @param fileList the fileList to set */ public void setFileList(Map<String,String> fileList) { this.fileList = fileList; }}
3.响应参数类
import java.util.HashMap;import java.util.Map;import org.apache.http.Header;/** * ClassName: BasicResponse * * @author xiezhaoqing192 * @date 2016年4月26日 */public class ResponseParameter { private int respcode; private String respdata; private String respmsg; private String uniqueid; private int runtime; private String urlString; private Map<String,String>headers=new HashMap<String,String>(); public Integer getRespcode() { return respcode; } public void setRespcode(Integer respcode) { this.respcode = respcode; } public String getRespmsg() { return respmsg; } public void setRespmsg(String respmsg) { this.respmsg = respmsg; } public String getUniqueid() { return uniqueid; } public void setUniqueid(String uniqueid) { this.uniqueid = uniqueid; } public Integer getRuntime() { return runtime; } public void setRuntime(Integer runtime) { this.runtime = runtime; } /** * @return the headers */ public Map<String,String> getHeaders() { return headers; } /** * @param headers the headers to set */ public void setHeaders(Header[] headers) { if(headers!=null) for(Header header:headers) { this.headers.put(header.getName(), header.getValue()); } } /** * @return the urlString */ public String getUrlString() { return urlString; } /** * @param urlString the urlString to set */ public void setUrlString(String urlString) { this.urlString = urlString; } /** * @return the respdata */ public String getRespdata() { return respdata; } /** * @param respdata the respdata to set */ public void setRespdata(String respdata) { this.respdata = respdata; }}
4.创建URI
import java.net.URI;import java.net.URISyntaxException;import java.util.List;import org.apache.http.NameValuePair;import org.apache.http.client.utils.URIBuilder;/** * ClassName: HttpURIBuilder * * @author xiezhaoqing192 * @date 2016年4月26日 */public class HttpURIBuilder { public static URI buildHttpURI(String host, int port, String api, List<NameValuePair> nvps,String protocol) { URI uri = URI.create(""); try { URIBuilder builder = new URIBuilder(); builder.setScheme(protocol); builder.setHost(host); builder.setPort(port); builder.setPath(api); if(null != nvps) for (NameValuePair nvp:nvps){ builder.setParameter(nvp.getName(), nvp.getValue()); } uri = builder.build(); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return uri; }}
5.HttpClient具体实现类
import java.io.File;import java.io.IOException;import java.net.URI;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.http.entity.mime.content.FileBody; import javax.net.ssl.SSLContext;import javax.net.ssl.SSLException;import javax.net.ssl.SSLSession;import javax.net.ssl.SSLSocket;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.commons.httpclient.ConnectTimeoutException;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.ParseException;import org.apache.http.ProtocolVersion;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpDelete;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpPut;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.scheme.PlainSocketFactory;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.conn.ssl.X509HostnameVerifier;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;import org.apache.http.message.BasicHttpResponse;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpParams;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.StringBody;/** * ClassName: HttpResImpl * @warming 这个类为核心类,封装了基本请求,后置处理器,类正则提取,请勿更改任何逻辑 2016.05.20 at丁晶晶 * @author xiezhaoqing192 * @date 2016年4月26日 */@SuppressWarnings("deprecation")public class HttpResImpl implements HttpRes{ private Logger logger = LoggerFactory.getLogger(HttpResImpl.class); private HttpClient httpclient = null; private HttpResponse response = null; private Map<String,String> afterCatchPool=new HashMap<String,String>(); @Override public HttpResponse getInstance() { if (null == response) { response = new BasicHttpResponse(new ProtocolVersion("HTTP_ERROR", 1, 1), 500, "ERROR"); } return response; } @Override public HttpClient createHttpClient(String protocol) { HttpParams params = new BasicHttpParams(); // 连接超时 HttpConnectionParams.setConnectionTimeout(params, HttpConstants.TIMEOUT); // 请求超时 HttpConnectionParams.setSoTimeout(params, HttpConstants.TIMEOUT); //保持长连接设置,后期将这个引出吧 // HttpConnectionParams.setSoKeepalive(params, false); // 设置我们的HttpClient支持HTTP和HTTPS两种模式 SchemeRegistry schReg = new SchemeRegistry(); if ("HTTP".equals(protocol.toUpperCase())) { schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); } else if ("HTTPS".equals(protocol.toUpperCase())) { // 创建TrustManager() // 用于解决javax.net.ssl.SSLPeerUnverifiedException: peer not // authenticated X509TrustManager trustManager = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; // 创建HostnameVerifier // 用于解决javax.net.ssl.SSLException: hostname in certificate didn't // match: <202.69.27.140> != <*.pingan.com.cn> X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() { @Override public void verify(String host, SSLSocket ssl) throws IOException { } @Override public void verify(String host, X509Certificate cert) throws SSLException { } @Override public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { } @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }; SSLContext sslContext = null; try { sslContext = SSLContext.getInstance(SSLSocketFactory.TLS); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 使用TrustManager来初始化该上下文,TrustManager只是被SSL的Socket所使用 try { sslContext.init(null, new TrustManager[] { trustManager }, null); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 创建SSLSocketFactory SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext, hostnameVerifier); schReg.register(new Scheme("https", socketFactory, 443)); } else { logger.error("不支持除http/https之外的协议"); } // 使用线程安全的连接管理来创建HttpClient ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); if(httpclient==null){ httpclient = new DefaultHttpClient(conMgr, params); } return httpclient; } @Override public List<ResponseParameter> execute(RequestParameter reqparams) { httpclient = createHttpClient(reqparams.getProtocol()); response = getInstance(); List<ResponseParameter> resparams = new ArrayList<ResponseParameter>(); for (BasicParameter bp : reqparams.getBasparams()) { List<NameValuePair> params = new ArrayList<NameValuePair>(); params = MapToNvps.convertToNvps(bp.getParamters(),afterCatchPool); ResponseParameter rp = new ResponseParameter(); long startMili = 0;//定义开始时间 long endMili=0;//定义结束时间 URI request = HttpURIBuilder.buildHttpURI(reqparams.getHost(), reqparams.getPort(), bp.getApiUrl(), params, reqparams.getProtocol()); String urlString=request.toString(); try { if ("GET".equals(bp.getMethod().toUpperCase())) { HttpGet hg = new HttpGet(request); startMili=System.currentTimeMillis();// 当前时间对应的毫秒数 response = httpclient.execute(hg); endMili=System.currentTimeMillis();// 当前时间对应的毫秒数-结束 } else if ("POST".equals(bp.getMethod().toUpperCase())) { HttpPost httppost = new HttpPost(request); MultipartEntity entity = new MultipartEntity(); if(bp.getFileList()!=null) for( Map.Entry<String, String> filePara:bp.getFileList().entrySet()){ try{ File file = new File(filePara.getValue()); FileBody fileBody = new FileBody(file); entity.addPart(filePara.getKey(), fileBody); } catch(Exception e){ } }; for(Map.Entry<String, String> para:bp.getParamters().entrySet()){ StringBody paraMeters = new StringBody(para.getValue()); entity.addPart(para.getKey(), paraMeters); } httppost.setEntity(entity); startMili=System.currentTimeMillis();// 当前时间对应的毫秒数 response = httpclient.execute(httppost); endMili=System.currentTimeMillis();// 当前时间对应的毫秒数-结束 } else if ("PUT".equals(bp.getMethod().toUpperCase())) { HttpPut p = new HttpPut(request); startMili=System.currentTimeMillis();// 当前时间对应的毫秒数 response = httpclient.execute(p); endMili=System.currentTimeMillis();// 当前时间对应的毫秒数-结束 } else if ("DELETE".equals(bp.getMethod().toUpperCase())) { HttpDelete hd = new HttpDelete(request); startMili=System.currentTimeMillis();// 当前时间对应的毫秒数 response = httpclient.execute(hd); endMili=System.currentTimeMillis();// 当前时间对应的毫秒数-结束 } rp.setHeaders(response.getAllHeaders()); rp.setRespcode(response.getStatusLine().getStatusCode()); rp.setRespmsg(response.getStatusLine().getReasonPhrase()); rp.setUniqueid(bp.getUniqueid()); rp.setUrlString(urlString); rp.setRuntime((int) (endMili-startMili)); try{ rp.setRespdata(EntityUtils.toString(response.getEntity(),"UTF-8"));} catch(IOException e){ rp.setRespdata("自动化平台不支持的返回对象"); } } catch (UnknownHostException e) { // TODO Auto-generated catch block endMili=System.currentTimeMillis(); e.printStackTrace(); rp.setHeaders(null); rp.setRespcode(408); rp.setRespdata(null); rp.setRespmsg("找不到服务器:"+e.getMessage()); rp.setUniqueid(bp.getUniqueid()); rp.setRuntime((int) (endMili-startMili)); rp.setUrlString(urlString); } catch (ConnectTimeoutException e) { // TODO Auto-generated catch block endMili=System.currentTimeMillis(); e.printStackTrace(); rp.setHeaders(null); rp.setRespcode(408); rp.setRespdata(null); rp.setRespmsg("连接超时:"+e.getMessage()); rp.setUniqueid(bp.getUniqueid()); rp.setRuntime((int) (endMili-startMili)); rp.setUrlString(urlString); } catch (ClientProtocolException e) { // TODO Auto-generated catch block endMili=System.currentTimeMillis(); e.printStackTrace(); rp.setHeaders(null); rp.setRespcode(408); rp.setRespdata(null); rp.setRespmsg(e.getMessage()); rp.setUniqueid(bp.getUniqueid()); rp.setRuntime((int) (endMili-startMili)); rp.setUrlString(urlString); } catch (IOException e) { // TODO Auto-generated catch block endMili=System.currentTimeMillis(); e.printStackTrace(); rp.setHeaders(null); rp.setRespcode(408); rp.setRespdata(null); rp.setRespmsg(e.getMessage()); rp.setUniqueid(bp.getUniqueid()); rp.setRuntime((int) (endMili-startMili)); rp.setUrlString(urlString); } catch (Exception e) { endMili=System.currentTimeMillis(); e.printStackTrace(); rp.setHeaders(null); rp.setRespcode(408); rp.setRespdata(null); rp.setRespmsg(e.getMessage()); rp.setUniqueid(bp.getUniqueid()); rp.setRuntime((int) (endMili-startMili)); rp.setUrlString(urlString); } resparams.add(rp); String responseString; //获取接口的json Map<String,String>afterCatchMap= bp.getAfterCatch();//获取后置处理器 for(Map.Entry<String,String> afterCatch:afterCatchMap.entrySet()){ //这里异常不抛出去,如果这里出现错误,则直接给后置处理器赋空 try { responseString = rp.getRespdata();//获取接口的json String afterCatchValue=JsonHelper.getValueInJsonStringByKey(afterCatch.getValue(), responseString);//获取json提取值 afterCatchPool.put(afterCatch.getKey(), afterCatchValue); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); afterCatchPool.put(afterCatch.getKey(), null); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); afterCatchPool.put(afterCatch.getKey(), null); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); afterCatchPool.put(afterCatch.getKey(), null); } } } return resparams; } /** * @return the afterCatchPool */ public Map<String,String> getAfterCatchPool() { return afterCatchPool; } /** * @param afterCatchPool the afterCatchPool to set */ public void setAfterCatchPool(Map<String,String> afterCatchPool) { this.afterCatchPool = afterCatchPool; }}
以上就实现了支持http/https协议的client。
作者:谢照青文/道韫(简书作者)
原文链接:http://www.jianshu.com/p/309259e07473
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/309259e07473
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0 0
- 使用httpclient构造http/https客户端
- Android:使用HttpClient访问HTTP/HTTPS服务器
- httpclient支持https,http请求
- HttpClient 发送 HTTP、HTTPS 请求
- 使用libcurl库编写HTTP客户端(包括GET/POST/HTTPS)
- httpclient关于https的使用
- HttpClient中post请求http、https示例
- HttpClient中post请求http、https示例
- http httpclient使用
- Http协议客户端工具之Httpclient
- HttpClient 教程5 (HTTP客户端服务)
- HttpClient 教程5 (HTTP客户端服务)
- 使用httpclient来进行https访问
- [Android实例] Android 使用HttpClient访问https
- httpclient 无信任证书使用https
- httpclient中使用HTTPS的方法
- HttpClient 使用代理访问Https【转】
- httpclient 无信任证书使用https
- python 类,类实例及其它对象的内建函数
- 微信支付有汉字时出现签名错误的解决办法
- intellij idea14 +svn配置
- 1. Event List
- 文字向左无缝滚动
- 使用httpclient构造http/https客户端
- shell 基本语法测试
- cherrypy简介
- 调用完系统相机,状态栏消失
- POJ3254Corn Fields
- AFNetworking 文件上传Data,File图片,文件等上传
- HDOJ 5137 How Many Maos Does the Guanxi Worth
- ATCA标准与测试
- POJ 3071 Football(概率dp)