`
yangguangfu
  • 浏览: 1530849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

xUtils 中的HttpUtils全面注释

 
阅读更多
/*


/**
 * 网络请求工具类
 * @author 阿福
 *
 */
public class HttpUtils {

    public final static HttpCache sHttpCache = new HttpCache();

    private final DefaultHttpClient httpClient;
    private final HttpContext httpContext = new BasicHttpContext();

    private HttpRedirectHandler httpRedirectHandler;

    /**
     * 构造方法,默认联网15秒超时
     */
    public HttpUtils() {
        this(HttpUtils.DEFAULT_CONN_TIMEOUT, null);
    }

    /**
     * 构造方法设置超时时间
     * @param connTimeout 超时时间毫秒
     */
    public HttpUtils(int connTimeout) {
        this(connTimeout, null);
    }

    /**
     * 构造方法,浏览器的信息包
     * @param userAgent
     */
    public HttpUtils(String userAgent) {
        this(HttpUtils.DEFAULT_CONN_TIMEOUT, userAgent);
    }

    /**
     * 构造方法
     * @param connTimeout 链接超时时间,毫秒单位
     * @param userAgent  浏览器的信息包
     */
    public HttpUtils(int connTimeout, String userAgent) {
        HttpParams params = new BasicHttpParams();

        ConnManagerParams.setTimeout(params, connTimeout);
        HttpConnectionParams.setSoTimeout(params, connTimeout);
        HttpConnectionParams.setConnectionTimeout(params, connTimeout);

        if (TextUtils.isEmpty(userAgent)) {
            userAgent = OtherUtils.getUserAgent(null);
        }
        HttpProtocolParams.setUserAgent(params, userAgent);

        ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(10));
        ConnManagerParams.setMaxTotalConnections(params, 10);

        HttpConnectionParams.setTcpNoDelay(params, true);
        HttpConnectionParams.setSocketBufferSize(params, 1024 * 8);
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        schemeRegistry.register(new Scheme("https", DefaultSSLSocketFactory.getSocketFactory(), 443));

        httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params);

        httpClient.setHttpRequestRetryHandler(new RetryHandler(DEFAULT_RETRY_TIMES));

        httpClient.addRequestInterceptor(new HttpRequestInterceptor() {
            @Override
            public void process(org.apache.http.HttpRequest httpRequest, HttpContext httpContext) throws org.apache.http.HttpException, IOException {
                if (!httpRequest.containsHeader(HEADER_ACCEPT_ENCODING)) {
                    httpRequest.addHeader(HEADER_ACCEPT_ENCODING, ENCODING_GZIP);
                }
            }
        });

        httpClient.addResponseInterceptor(new HttpResponseInterceptor() {
            @Override
            public void process(HttpResponse response, HttpContext httpContext) throws org.apache.http.HttpException, IOException {
                final HttpEntity entity = response.getEntity();
                if (entity == null) {
                    return;
                }
                final Header encoding = entity.getContentEncoding();
                if (encoding != null) {
                    for (HeaderElement element : encoding.getElements()) {
                        if (element.getName().equalsIgnoreCase("gzip")) {
                            response.setEntity(new GZipDecompressingEntity(response.getEntity()));
                            return;
                        }
                    }
                }
            }
        });
    }

    // ************************************    default settings & fields ****************************

    
    private String responseTextCharset = HTTP.UTF_8;

    private long currentRequestExpiry = HttpCache.getDefaultExpiryTime();

    private final static int DEFAULT_CONN_TIMEOUT = 1000 * 15; // 15s

    private final static int DEFAULT_RETRY_TIMES = 3;

    private static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";
    private static final String ENCODING_GZIP = "gzip";

    private final static int DEFAULT_POOL_SIZE = 3;
    private final static PriorityExecutor EXECUTOR = new PriorityExecutor(DEFAULT_POOL_SIZE);

    public HttpClient getHttpClient() {
        return this.httpClient;
    }

    // ***************************************** config *******************************************

    /**
     * 配置请求文本编码,默认UTF-8
     * @param charSet
     * @return
     */
    public HttpUtils configResponseTextCharset(String charSet) {
        if (!TextUtils.isEmpty(charSet)) {
            this.responseTextCharset = charSet;
        }
        return this;
    }

    /**
     * http重定向处理
     * @param httpRedirectHandler
     * @return
     */
    public HttpUtils configHttpRedirectHandler(HttpRedirectHandler httpRedirectHandler) {
        this.httpRedirectHandler = httpRedirectHandler;
        return this;
    }

    /**
     * 配置http缓存大小
     * @param httpCacheSize
     * @return
     */
    public HttpUtils configHttpCacheSize(int httpCacheSize) {
        sHttpCache.setCacheSize(httpCacheSize);
        return this;
    }

    /**
     * 配置默认http缓存失效 ,默认是60秒
     * @param defaultExpiry 
     * @return
     */
    public HttpUtils configDefaultHttpCacheExpiry(long defaultExpiry) {
        HttpCache.setDefaultExpiryTime(defaultExpiry);
        currentRequestExpiry = HttpCache.getDefaultExpiryTime();
        return this;
    }

    /**
     * 配置当前http缓存失效,时间默认60秒
     * @param currRequestExpiry
     * @return
     */
    public HttpUtils configCurrentHttpCacheExpiry(long currRequestExpiry) {
        this.currentRequestExpiry = currRequestExpiry;
        return this;
    }

    /**
     * cookie存储配置
     * @param cookieStore
     * @return
     */
    public HttpUtils configCookieStore(CookieStore cookieStore) {
        httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
        return this;
    }

    /**
     * 配置浏览器信息包
     * @param userAgent
     * @return
     */
    public HttpUtils configUserAgent(String userAgent) {
        HttpProtocolParams.setUserAgent(this.httpClient.getParams(), userAgent);
        return this;
    }

    /**
     * 配置时间链接超时
     * @param timeout
     * @return
     */
    public HttpUtils configTimeout(int timeout) {
        final HttpParams httpParams = this.httpClient.getParams();
        ConnManagerParams.setTimeout(httpParams, timeout);
        HttpConnectionParams.setConnectionTimeout(httpParams, timeout);
        return this;
    }

    /**
     * 配置socket时间连接溢出
     * @param timeout
     * @return
     */
    public HttpUtils configSoTimeout(int timeout) {
        final HttpParams httpParams = this.httpClient.getParams();
        HttpConnectionParams.setSoTimeout(httpParams, timeout);
        return this;
    }

    /**
     * 配置注册Scheme
     * @param scheme
     * @return
     */
    public HttpUtils configRegisterScheme(Scheme scheme) {
        this.httpClient.getConnectionManager().getSchemeRegistry().register(scheme);
        return this;
    }

    /**
     * 配置SSLSocketFactory
     * @param sslSocketFactory
     * @return
     */
    public HttpUtils configSSLSocketFactory(SSLSocketFactory sslSocketFactory) {
        Scheme scheme = new Scheme("https", sslSocketFactory, 443);
        this.httpClient.getConnectionManager().getSchemeRegistry().register(scheme);
        return this;
    }

    /**
     * 配置请求重试次数
     * @param count 重试次数
     * @return
     */
    public HttpUtils configRequestRetryCount(int count) {
        this.httpClient.setHttpRequestRetryHandler(new RetryHandler(count));
        return this;
    }

    /**
     * 配置请求线程池个数
     * @param threadPoolSize 线程池个数
     * @return
     */
    public HttpUtils configRequestThreadPoolSize(int threadPoolSize) {
        HttpUtils.EXECUTOR.setPoolSize(threadPoolSize);
        return this;
    }

    // ***************************************** send request 发送请求*******************************************

    /**
     * 发送异步网络请求 -重要
     * @param method get或者post请求等等
     * @param url 网络请求路径
     * @param callBack 回调
     * @return
     */
    public <T> HttpHandler<T> send(HttpRequest.HttpMethod method, String url,
                                   RequestCallBack<T> callBack) {
        return send(method, url, null, callBack);
    }

    /**
     * 发送异步网络请求 -重要
     * @param method get或者post请求等等
     * @param url 网络请求路径
     * @param params 请求参数
     * @param callBack 回调
     * @return
     */
    public <T> HttpHandler<T> send(HttpRequest.HttpMethod method, String url, RequestParams params,
                                   RequestCallBack<T> callBack) {
        if (url == null) throw new IllegalArgumentException("url may not be null");

        HttpRequest request = new HttpRequest(method, url);
        return sendRequest(request, params, callBack);
    }

    /**
     * 发送同步网络请求 -用得不多
     * @param method get或者post等方法
     * @param url 联网网络url
     * @return
     * @throws HttpException
     */
    public ResponseStream sendSync(HttpRequest.HttpMethod method, String url) throws HttpException {
        return sendSync(method, url, null);
    }

    /**
     * 发送同步网络请求 -用得不多
     * @param method get或者post等方法
     * @param url 联网网络url 
     * @param params 请求参数
     * @return
     * @throws HttpException
     */
    public ResponseStream sendSync(HttpRequest.HttpMethod method, String url, RequestParams params) throws HttpException {
        if (url == null) throw new IllegalArgumentException("url may not be null");

        HttpRequest request = new HttpRequest(method, url);
        return sendSyncRequest(request, params);
    }

    // ***************************************** download  下载*******************************************

    /**
     * 下载文件方法
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(String url, String target,
                                      RequestCallBack<File> callback) {
        return download(HttpRequest.HttpMethod.GET, url, target, null, false, false, callback);
    }

    /**
     * 下载文件方法
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param autoResume 是否自动恢复下载
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(String url, String target,
                                      boolean autoResume, RequestCallBack<File> callback) {
        return download(HttpRequest.HttpMethod.GET, url, target, null, autoResume, false, callback);
    }

    /**
     * 下载文件方法
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param autoResume  是否自动恢复下载
     * @param autoRename 是否自动重命名
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(String url, String target,
                                      boolean autoResume, boolean autoRename, RequestCallBack<File> callback) {
        return download(HttpRequest.HttpMethod.GET, url, target, null, autoResume, autoRename, callback);
    }

    /**
     * 下载文件方法
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param params 参数类
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(String url, String target,
                                      RequestParams params, RequestCallBack<File> callback) {
        return download(HttpRequest.HttpMethod.GET, url, target, params, false, false, callback);
    }

    /**
     * 下载文件方法
     * @param url  下载文件的url
     * @param target 下载保存的目录
     * @param params 参数类
     * @param autoResume 是否自动恢复下载
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(String url, String target,
                                      RequestParams params, boolean autoResume, RequestCallBack<File> callback) {
        return download(HttpRequest.HttpMethod.GET, url, target, params, autoResume, false, callback);
    }

    /**
     * 下载文件方法
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param params 参数
     * @param autoResume 是否自动恢复
     * @param autoRename 是否自动命名
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(String url, String target,
                                      RequestParams params, boolean autoResume, boolean autoRename, RequestCallBack<File> callback) {
        return download(HttpRequest.HttpMethod.GET, url, target, params, autoResume, autoRename, callback);
    }

    /**
     * 下载文件方法
     * @param method 请求用get还是post等
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param params 参数
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(HttpRequest.HttpMethod method, String url, String target,
                                      RequestParams params, RequestCallBack<File> callback) {
        return download(method, url, target, params, false, false, callback);
    }

    /**
     * 下载文件方法
     * @param method 请求用get还是post等
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param params 参数
     * @param autoResume 是否自动恢复下载
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(HttpRequest.HttpMethod method, String url, String target,
                                      RequestParams params, boolean autoResume, RequestCallBack<File> callback) {
        return download(method, url, target, params, autoResume, false, callback);
    }

    /**
     * 下载文件方法
     * @param method 请求用get还是post等
     * @param url 下载文件的url
     * @param target 下载保存的目录
     * @param params 参数
     * @param autoResume 是否自动恢复下载
     * @param autoRename 是否自动重命名
     * @param callback 回调
     * @return
     */
    public HttpHandler<File> download(HttpRequest.HttpMethod method, String url, String target,
                                      RequestParams params, boolean autoResume, boolean autoRename, RequestCallBack<File> callback) {

        if (url == null) throw new IllegalArgumentException("url may not be null");
        if (target == null) throw new IllegalArgumentException("target may not be null");

        HttpRequest request = new HttpRequest(method, url);

        HttpHandler<File> handler = new HttpHandler<File>(httpClient, httpContext, responseTextCharset, callback);

        handler.setExpiry(currentRequestExpiry);
        handler.setHttpRedirectHandler(httpRedirectHandler);

        if (params != null) {
            request.setRequestParams(params, handler);
            handler.setPriority(params.getPriority());
        }
        handler.executeOnExecutor(EXECUTOR, request, target, autoResume, autoRename);
        return handler;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////
    private <T> HttpHandler<T> sendRequest(HttpRequest request, RequestParams params, RequestCallBack<T> callBack) {

        HttpHandler<T> handler = new HttpHandler<T>(httpClient, httpContext, responseTextCharset, callBack);

        handler.setExpiry(currentRequestExpiry);
        handler.setHttpRedirectHandler(httpRedirectHandler);
        request.setRequestParams(params, handler);

        if (params != null) {
            handler.setPriority(params.getPriority());
        }
        handler.executeOnExecutor(EXECUTOR, request);
        return handler;
    }

    private ResponseStream sendSyncRequest(HttpRequest request, RequestParams params) throws HttpException {

        SyncHttpHandler handler = new SyncHttpHandler(httpClient, httpContext, responseTextCharset);

        handler.setExpiry(currentRequestExpiry);
        handler.setHttpRedirectHandler(httpRedirectHandler);
        request.setRequestParams(params);

        return handler.sendRequest(request);
    }
}

 

分享到:
评论
1 楼 Letitbeee 2016-05-19  
解释不错

相关推荐

    commons.lang3.ClassUtils 源码中文注释

    org.apache.commons.lang3.ClassUtils 源码中文注释,之后会加上其他的工具类注释,方便以后复习阅读

    qrcode-utils-1.1-API文档-中文版.zip

    赠送jar包:qrcode-utils-1.1.jar; 赠送原API文档:qrcode-utils-1.1-javadoc.jar; 赠送源代码:qrcode-utils-1.1-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    sg3-utils 静态编译包

    注意:在unbuntu上按照压缩文档中的《sg3_utils测试工具交叉编译,静态编译.pdf》进行操作,可自行编译sg3_utils arm64 静态包 sg3_utils ARM64 静态编译链接程序,可直接在arm64平台上运行,用于对scsi 设备进行...

    hk2-utils-2.4.0-b34-API文档-中文版.zip

    赠送jar包:hk2-utils-2.4.0-b34.jar; 赠送原API文档:hk2-utils-2.4.0-b34-javadoc.jar; 赠送源代码:hk2-utils-2.4.0-b34-sources....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    vue-cli脚手架build目录下utils.js工具配置文件详解

    此文章用来解释vue-cli脚手架build目录中的utils.js配置文件 1.此配置文件是vue开发环境的wepack相关配置文件,主要用来处理css-loader和vue-style-loader 2.关于注释 •当涉及到较复杂的解释我将通过标识的方式...

    hk2-utils-2.4.0-b34-API文档-中英对照版.zip

    赠送jar包:hk2-utils-2.4.0-b34.jar; 赠送原API文档:hk2-utils-2.4.0-b34-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    Trinea Android Common Utils

    目前包括HttpUtils、DownloadManagerPro、ShellUtils、PackageUtils、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、...

    sg3_utils的库

    sg3 utils 亲测,可用版本,需要根据自己的平台去编译 This package contains low level utilities for devices that use the SCSI command set. Originally the SCSI command set was associated exclusively with ...

    source insight 添加块注释,全选等的脚本文件 utils.rar,

    source insight 添加块注释,全选等的脚本文件,utils.em

    linux nfs-utils离线安装包

    linux centos7.5 nfs-utils 网络共享资源离线rpm安装包,包括nfs-utils 的依赖包,方便使用

    utils-gg_utils.h

    utils-gg_utils.h

    qrcode-utils-1.1-API文档-中英对照版.zip

    赠送jar包:qrcode-utils-1.1.jar; 赠送原API文档:qrcode-utils-1.1-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    mtd-utils安装包

    里面包含安装mtd-utils所有涉及到的安装包,给具有同样需求的人方便: mtd-utils-1.5.0.tar.bz2 lzo-2.06.tar.gz zlib-1.2.8.tar.gz

    utils-gg_utils.c

    utils-gg_utils.c

    base64utils jar 包下载

    base64utils jar 项目中应用,亲测,希望能帮到您,加油 少年

    canutils-4.0.6及其使用说明

    canutils-4.0.6及其使用说明,主要是备份一下资料,所以上传到这里。

    Android系统编译canutils

    内含移植成功的canutils源码+libsocketcan源码,说明内已经写好编译方法和编译后使用方法,对新手友好。 需要换版本可以直接替换源码,源码使用Android.bp编译canutils(注意Android 7以后的系统才支持Android.bp,...

    yum-utils.zip

    [root@localhost yum-utils]# rpm -qa |grep yum-utils 卸载 [root@localhost yum-utils]# rpm -e --nodeps yum-utils-1.1.31-40.el7.noarch 上传离线版本包并解压 安装 [root@localhost yum-utils]# rpm -ivh...

    exfat-utils-1.0.1.tar.gz_exfat_exfat utils_exfat-utils_exfat-uti

    exfat 文件系统linux格式化代码,非常好用,直接交叉编译,就能使用,快速格式化代码

    json-utils.py

    json_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_utils.pyjson_...

Global site tag (gtag.js) - Google Analytics