AsyncHttpClient异步请求工具箱/简单使用(异步的同步支持)

简介

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值