您的位置:首页 > 理论基础 > 计算机网络

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: