Httpclient实现RPC
2017-12-06 18:27
38 查看
HttpClient简介
Get方法请求
Post方式请求
通用类封装
一.HttpClient简介
HttpClient是Apache jakarta common下维护的子项目,封装在 commons-httpclient jar包中,是一个能提供高效、功能丰富的支持http协议的客户端工具包,在java中的应用主要体现在模拟客户端请求,例如同其他系统或项目进行API数据的交互等,同时也是RPC的实现方式之一。为解决并发量大问题,建议升级到高版本,如4.0以上
maven项目直接引入jar依赖
二.Get方式请求
Get方式请求主要分为以下步骤:
1、创建客户端
三.Post方式请求
HttpClient基于post方式请求步骤基本同Get方式,除了
四.通用类的封装(使用 MultiThreadedHttpConnectionManager类管理httpclient是为了解决多线程下并发访问的问题)
使用httpclient一定要要根据实际项目场景正确设置上面那几个参数,不然会有风险的。如并发量大时连接池不够、请求等待等风险,这些是比较难测试出来的 .
Get方法请求
Post方式请求
通用类封装
一.HttpClient简介
HttpClient是Apache jakarta common下维护的子项目,封装在 commons-httpclient jar包中,是一个能提供高效、功能丰富的支持http协议的客户端工具包,在java中的应用主要体现在模拟客户端请求,例如同其他系统或项目进行API数据的交互等,同时也是RPC的实现方式之一。为解决并发量大问题,建议升级到高版本,如4.0以上
maven项目直接引入jar依赖
<!-- HttpClient依赖 --> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>
二.Get方式请求
Get方式请求主要分为以下步骤:
1、创建客户端
HttpClient client = new HttpClient();2、创建Get方式连接实例
GetMethod getMethod = new GetMethod(url);3、execute方法执行方法实例
client.executeMethod(getMethod);4、读取响应response信息
getMethod.getResponseBody()5、处理获取到的response信息并释放连接
method.releaseConnection();
三.Post方式请求
HttpClient基于post方式请求步骤基本同Get方式,除了
PostMethod method = new PostMethod(url);
四.通用类的封装(使用 MultiThreadedHttpConnectionManager类管理httpclient是为了解决多线程下并发访问的问题)
public class HttpClientUtils { private static Logger log = LoggerFactory.getLogger(HttpClientUtils.class); private static final String ENCODING = "UTF-8"; private static final int CONNECTION_TIME_OUT = 3000; private static final int SO_TIME_OUT = 5000; private static final boolean STALE_CHECK_ENABLED = true; private static final boolean TCP_NO_DELAY = true; private static final int DEFAULT_MAX_CONNECTIONS_PER_HOST = 100; private static final int MAX_TOTAL_CONNECTIONS = 1000; private static final HttpConnectionManager connectionManager; private static final HttpClient client; static { HttpConnectionManagerParams params = loadHttpConfFromFile(); connectionManager = new MultiThreadedHttpConnectionManager(); connectionManager.setParams(params); client = new HttpClient(connectionManager); } private static HttpConnectionManagerParams loadHttpConfFromFile() { //这几个参数很重要 HttpConnectionManagerParams params = new HttpConnectionManagerParams(); params.setConnectionTimeout(CONNECTION_TIME_OUT); //连接超时时长 params.setStaleCheckingEnabled(STALE_CHECK_ENABLED); //是否启用旧连接检查 params.setTcpNoDelay(TCP_NO_DELAY); params.setSoTimeout(SO_TIME_OUT); //读取数据超时时长 params.setDefaultMaxConnectionsPerHost(DEFAULT_MAX_CONNECTIONS_PER_HOST); //由MultiThreadedHttpConnectionManager管理的最大连接数 params.setMaxTotalConnections(MAX_TOTAL_CONNECTIONS); //最大连接数 params.setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false)); return params; } public static String post(String url, String encoding, String content) { try { byte[] resp = post(url, content.getBytes(encoding)); if (null == resp) return null; return new String(resp, encoding); } catch (UnsupportedEncodingException e) { log.error(e.toString()); return null; } } public static byte[] post(String url, byte[] content) { try { byte[] ret = post(url, new ByteArrayRequestEntity(content)); return ret; } catch (Exception e) { log.error(e.toString()); return null; } } public static byte[] post(String url, RequestEntity requestEntity) throws Exception { PostMethod method = new PostMethod(url); method.addRequestHeader("Connection", "Keep-Alive"); //这个参数也很重要 method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES); method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false)); method.setRequestEntity(requestEntity); method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded"); try { int statusCode = client.executeMethod(method); if (statusCode != HttpStatus.SC_OK) { return null; } return method.getResponseBody(); } catch (SocketTimeoutException e) { log.error(e.toString()); return null; } catch (Exception e) { log.error(e.toString()); return null; } finally { if (method != null) { method.releaseConnection(); } } } public static String doPostByContentType(String url, String contentType, String content) throws Exception { PostMethod method = new PostMethod(url); method.addRequestHeader("Connection", "Keep-Alive"); method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES); method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false)); method.setRequestEntity(new ByteArrayRequestEntity(content.getBytes(ENCODING))); method.addRequestHeader("Content-Type", contentType); try { int statusCode = client.executeMethod(method); if (statusCode != HttpStatus.SC_OK) { return null; } byte[] ret = method.getResponseBody(); if (ret == null) return null; return new String(ret, ENCODING); } catch (SocketTimeoutException e) { log.error(e.toString()); return null; } catch (Exception e) { log.error(e.toString()); return null; } finally { if (method != null) { method.releaseConnection(); } } } public static String doGet(String _url) { try { GetMethod getMethod = new GetMethod(_url); client.executeMethod(getMethod); return inputStream2String(getMethod.getResponseBodyAsStream()); } catch (Exception e) { e.printStackTrace(); log.error(e.toString()); return null; } } public static String doGetUrl(String _url) throws Exception { GetMethod getMethod = new GetMethod(_url); client.executeMethod(getMethod); return inputStream2String(getMethod.getResponseBodyAsStream()); } private static String inputStream2String(InputStream is) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(is)); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = in.readLine()) != null) { buffer.append(line); } return buffer.toString(); } private static String inputStream2String(InputStream is, String encoding) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(is, encoding)); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = in.readLine()) != null) { buffer.append(line); } return buffer.toString(); } }
//调用方
StringBuilder sb = new StringBuilder("xxx.xxx.com"); sb.append("?applt=").append(applt).a c4f7 ppend("&token=").append(token); HttpClientUtils.doGet(sb.toString());
使用httpclient一定要要根据实际项目场景正确设置上面那几个参数,不然会有风险的。如并发量大时连接池不够、请求等待等风险,这些是比较难测试出来的 .
相关文章推荐
- 基于HttpClient实现RPC远程服务调用【SpringBoot项目】
- RPC的实现与远程调用的实现机制
- 用java Socket实现HttpClient可能出现的一个错误
- cocos2dx结合HttpClient与rapidjson实现post网络通信
- 自定义基于netty的rpc框架(4)---zk和utils以及protocol的实现
- Android--Apache HttpClient(2种实现)
- Go实战--golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc)
- Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听
- 使用httpclient 4.4实现需要basic auth认证的http请求
- RPC框架原理与实现
- 6.dubbo的rpc功能简化实现
- RPC 的概念模型与实现解析
- 基于Netty4的HttpServer和HttpClient的简单实现
- Spring-rabbitmq 实现RPC 风格调用实例
- rpc框架yar之源码解析- 打包的实现
- [转]使用 HttpClient 和 HtmlParser 实现简易爬虫
- RabbitMQ 实现RPC
- HttpClient之实现POST方法
- 【远程调用框架】如何实现一个简单的RPC框架(一)想法与设计
- SSH+CKeditor下使用HttpClient实现文件的上传