AsyncHttpClient异步请求工具箱/简单使用(异步的同步支持)
2015-05-29 09:44
791 查看
简介
AsyncHttpClient 谷歌的开源工具包,使用java中的Future来实现异步的;但是使用中发现 需要调用需要Future.get()才能真正的开始发送,感觉上和同步阻塞的没有太大的区别
如果有知道用AsyncHttpClient 类能达到异步效果的的,请回复我;
需求效果如下: (特别笨的一个替方案)
执行代码... 异步请求..不需要等待返回的结果,继续执行下面的代码 执行代码...
而使用下面的工具类,最多只能实现如下的效果
执行代码... Future f = AsyncHttpKit.post(...); 执行代码... f.get(); //要执行get之后,才会真正的去访问获取数据
依赖jar包
依赖jar包说明:1.9之前的api和1.9之后的api不相同,本人也只是浅显的调用api,发现1.9之后发送中文参数乱码,没有找到解决方法。<dependency> <groupId>com.ning</groupId> <artifactId>async-http-client</artifactId> <version>1.8.13</version> </dependency>
工具类
import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.Response; /** * AsyncHttpClient异步请求工具箱 * * @author Zq * */ public class AsyncHttpKit { private AsyncHttpKit() { }; private static final String DEFAULT_CHARSET = "UTF-8"; private static final long DEFEAT_TIMEOUT = 10; // 默认10秒超时 private static final TimeUnit DEFEAT_UNIT = TimeUnit.SECONDS; // 秒 /** * 获取请求结果 * * @param future * 调用请求后,得到的Futrue对象,如果获取失败,将抛出4种结果异常 * @return */ public static String getResult(Future<Response> future) { String result = getResult(future, null, null); return result; } /** * * @param future * 调用请求后,得到的Futrue对象,如果获取失败,将抛出4种结果异常 * @param timeOut * 指定该次获取等待的结果 * @param charset * 指定用什么编码获取该结果 * @return */ public static String getResult(Future<Response> future, Long timeOut, String charset) { Response response; String result = null; Long s_timeOut = timeOut == null ? DEFEAT_TIMEOUT : timeOut; String s_chareset = charset == null ? DEFAULT_CHARSET : charset; try { response = future.get(s_timeOut, DEFEAT_UNIT); response = future.get(); result = response.getResponseBody(s_chareset); } catch (Exception e) { throw new RuntimeException("获取结果出现错误:" + e.getMessage()); } return result; } /** * Get请求 * * @param http * @param url * @param params * 参数,key - value ,其中key 和 value 都不能为null,否则出错 * @param headers * 请求头 * @return */ public static Future<Response> get(AsyncHttpClient http, String url, Map<String, String> params, Map<String, String> headers) { AsyncHttpClient.BoundRequestBuilder builder = http.prepareGet(url); if (params != null && !params.isEmpty()) { Set<String> keys = params.keySet(); for (String key : keys) { builder.addParameter(key, params.get(key)); } } if (headers != null && !headers.isEmpty()) { Set<String> keys = headers.keySet(); for (String key : keys) { builder.addHeader(key, params.get(key)); } } Future<Response> f = null; try { f = builder.execute(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return f; } /** * Get请求 * * @param http * @param url * @param params * 参数key - value ,其中key 和 value 都不能为null,否则出错 * @return */ public static Future<Response> get(AsyncHttpClient http, String url, Map<String, String> params) { return get(http, url, params, null); } /** * Get请求 * * @param http * @param url * @return */ public static Future<Response> get(AsyncHttpClient http, String url) { return get(http, url, null); } /** * Post请求 * * @param http * @param url * @param params * 请求参数key - value ,其中key 和 value 都不能为null,否则出错 * @return */ public static Future<Response> post(AsyncHttpClient http, String url, Map<String, String> params) { AsyncHttpClient.BoundRequestBuilder builder = http.preparePost(url); builder.setBodyEncoding(DEFAULT_CHARSET); if (params != null && !params.isEmpty()) { Set<String> keys = params.keySet(); for (String key : keys) { builder.addParameter(key, params.get(key)); //1.9版本没有此api,是QueryParam,如果用次参数发送请求,会出现各种乱码 } } // builder.addHeader("Content-Type", "text/html;charset=UTF-8"); Future<Response> f = null; try { f = builder.execute(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return f; } /** * POST请求 * * @param http * @param url * @param s * json串 * @return */ public static Future<Response> post(AsyncHttpClient http, String url, String s) { AsyncHttpClient.BoundRequestBuilder builder = http.preparePost(url); builder.setBodyEncoding(DEFAULT_CHARSET); builder.setBody(s); Future<Response> f = null; try { f = builder.execute(); } catch (IOException e) { e.printStackTrace(); } return f; } }
相关文章推荐
- JAVA网络编程
- 贝叶斯网络
- sybase数据库备注至本机正常但是备份到网络路径时报错处理
- 【iOS解决方案】网络请求返回GB2312格式的xml数据转成UTF-8后为空(适用于论坛bbs)
- poj 1915 http://poj.org/problem?id=1915
- 网络记事本
- JAVA编写网络爬虫笔记(第二部分:httpClient下载页面)
- android 上传文件"Content-Type",为"application/octet-stream" 用php程序在服务端用$GLOBALS['HTTP_RAW_POST_DATA']接受(二)
- 设置并启用windows server2012 R2路由器
- shell检查网络出现异常、僵尸进程、内存过低后,自动重启
- 网络编程————TCP
- 网络编程————TCP
- 网络编程————UDP
- 网络编程————UDP
- 黑马程序员——网络编程的应用
- 黑马程序员——网络编程(二)
- tcp recv() 什么时候停止
- CA认证实现https访问
- 模式识别:三层BP神经网络的设计与实现
- 黑马程序员——网络编程(一)