HttpClient网络框架详解
2017-05-10 00:26
411 查看
优点
HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。
特性
基于标准、纯净的Java语言。实现了Http1.0和Http1.1以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
支持HTTPS协议。
通过Http代理建立透明的连接。
利用CONNECT方法通过Http代理建立隧道的https连接。
Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。
插件式的自定义认证方案。
便携可靠的套接字工厂使它更容易的使用第三方解决方案。
连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
自动处理Set-Cookie中的Cookie。
插件式的自定义Cookie策略。
Request的输出流可以避免流中内容直接缓冲到socket服务器。
Response的输入流可以有效的从socket服务器直接读取相应内容。
在http1.0和http1.1中利用KeepAlive保持持久连接。
直接获取服务器发送的response code和 headers。
设置连接超时的能力。
实验性的支持http1.1 response caching。
源代码基于Apache License 可免费获取。
现状
由于HttpClient存在API数量过多,扩展困难等缺点,在Android6.0系统中被完全移除,标志着该框架被正式弃用。所以本文之简单讲解,不做详细说明。
添加依赖
手动下载两个jar包,添加到libs文件夹下,add as library。dependencies { ... compile files('libs/httpclient-4.5.1.jar') compile files('libs/httpcore-4.2.4.jar') ... }
使用方法
创建HttpClient对象。创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
对于CloseableHttpClient, CloseableHttpResponse对象则需要释放连接。无论执行方法是否成功,都必须释放连接。
代码方法
public class GetPostUtil { private static GetPostUtil instance = new GetPostUtil(); public HttpClient httpClient = getThreadSafeClient(); //单例模式 public static GetPostUtil getInstance() { return instance; } //创建线程安全实例 public static DefaultHttpClient getThreadSafeClient() { DefaultHttpClient client = new DefaultHttpClient(); ClientConnectionManager mgr = client.getConnectionManager(); HttpParams params = client.getParams(); client = new DefaultHttpClient( new ThreadSafeClientConnManager(params, mgr.getSchemeRegistry()), params); return client; } public String get(final String url) { FutureTask<String> task = new FutureTask<String>(new Callable<String>() { String result; @Override public String call() throws Exception { HttpGet get = new HttpGet(url);//get请求对象 //get.setHeader(key,value); //设置请求头部 HttpResponse response = httpClient.execute(get);//发送请求 if (response.getStatusLine().getStatusCode() == 200) {//响应码 result = EntityUtils.toString(response.getEntity());//获取返回值 } return result; } }); new Thread(task).start();//处理获得返回值 String data = null; try { data = task.get(); } catch (Exception e) { e.printStackTrace(); } return data; } /** * post请求 * * @param url * @param maps * @return */ public String post(final String url, final Map<String, String> maps) { FutureTask<String> task = new FutureTask<String>( new Callable<String>() { String result; @Override public String call() { try { HttpPost post = new HttpPost(url);//post请求对象 List<NameValuePair> params = new ArrayList<NameValuePair>(); //map循环添加请求参数 for (String key : maps.keySet()) { params.add(new BasicNameValuePair(key, maps.get(key))); } post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));//添加请求参数体的编码 HttpResponse response = httpClient.execute(post);//发送请求 if (response.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(response.getEntity());//获取返回结果 } } catch (Exception e) { e.printStackTrace(); } return result; } }); new Thread(task).start();//处理获得返回值 String data = null; try { data = task.get(); } catch (Exception e) { e.printStackTrace(); } return data; } }
以上方法,对get请求,及post带参数请求进行简单的封装。具体疑问请看注释。
参考链接
http://blog.csdn.net/wangpeng047/article/details/19624529相关文章推荐
- 【COCOS2DX-LUA 脚本开发之八】不用CCHttpClient而转用quick-cocos2d-x或cocos2dx-LuaProxy的Lua框架实现Lua-Http网络交互!
- Android 网络操作学习HttpURLConnection与HttpClient及网络框架选择
- Android 网络请求HttpURLConnection 和 HttpClient详解
- lua教程八----不用CCHttpClient而转用quick-cocos2d-x或cocos2dx-LuaProxy的Lua框架实现Lua-Http网络交互!
- 使用AsyncHttpClient框架来完成网络数据的请求
- 强大的网络通信框架(不实现缓存)--第三方开源--AsyncHttpClient
- 【HTTPClient】HttpClient框架详解
- OkHttpClient网络框架封装
- 赠送 HttpClient 和HttpURLConnection 的轻型网络框架 ---》常见异常分析
- Base-Android快速开发框架(四)--网络操作之FastJson以及AsyncHttpClient
- 12_Android中HttpClient的应用,doGet,doPost,doHttpClientGet,doHttpClient请求,另外借助第三方框架实现网络连接的应用,
- Android网络框架学习之HttpClient
- 【代码】Android的网络通信详解HttpUrlConnection和HttpClient
- 赠送 HttpClient 和HttpURLConnection 的轻型网络框架 ---》按照自己的需求定制修改框架
- HttpClient实现网络访问详解
- android网络请求框架 HttpClient与Volley的性能对比
- Android-AsyncHttpClient网络框架
- android 学习随笔十一(网络:HttpClient框架)
- Android网络请求框架--AsyncHttpClient
- 12_Android中HttpClient的应用,doGet,doPost,doHttpClientGet,doHttpClient请求,另外借助第三方框架实现网络连接的应用,