基于AsyncHttpClient源码改造同步的LHttpClient

本文介绍了如何基于AsyncHttpClient源码创建一个同步版本的LHttpClient。作者从AsyncHttpClient 1.3.1和1.6.0版本中抽取代码,并在1.6.0版本的基础上进行了一些修改,移除了不必要部分,如auth代码,修复了引用错误。代码已上传至GitHub。文章详细列出了LHttpClient的主要组件,包括LHttpRequest、LHttpResponse等,并提供了简单调用示例。
摘要由CSDN通过智能技术生成

AsyncHttpClient:https://github.com/loopj/android-async-http

有时使用AsyncHttpClient时各种ResponseHandler使用很频繁。如果想要先后发送两个请求,在回调函数里面写起来很别扭,需要拆分成好几个方法,使用SyncHttpClient在回调里面写感觉怪怪的。根据它的源码摘出一个简单的、同步的LHttpClient,以备后用。做的工作只是代码搬运工,没有什么技术。参考源码版本为1.3.1和1.6.0,因为在1.6.0里面源码关联太多,有些东西不好直接使用。


谢谢@zhuxixi527提醒,post方法的时候没有传url,已经在代码上修改。但是下载资源不能编辑,只能重新上传一个了T_T


#2016-01-07修改

现在已经将代码同步到github:https://github.com/liguanliang2014/LHttpClient

修过了部分内容:增加了一个统一打印的log类,将auth的部分代码删除,修改之前的引用bug


代码结构如下:

com.net.lhttpclient

|---LHttpClient.java

|---LHttpRequest.java

|---LHttpResponse.java

|---LogUtil.java

|---RequestParams.java

|---RetryHandler.java

|---SimpleMultipartEntity.java


其中RequestParams.java、RetryHandler.java、SimpleMultipartEntity.java是从1.3.1版本直接复制过来的。


简单调用:

new Thread() {
			public void run() {
				LHttpClient httpClient = new LHttpClient();
				LHttpResponse response = httpClient.get("http://www.baidu.com");
				String str = "";
				try {
					str = new String(response.getResponse(), "utf-8");
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				System.out.println(str);
			}
		}.start();
以后再写几个包装LHttpResponse的类,类似AsyncHttpClient中的各种Handler,使用会更方便。

源码:

LHttpClient.java(主要修改部分就是自己写的get、post和sendRequest方法,代码412-439行,只是实现了get和post,其余四个没有实现)

package com.net.lhttpclient;

import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;

import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.HttpVersion;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.params.ConnPerRouteBean;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.HttpEntityWrapper;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.SyncBasicHttpContext;

import com.loopj.android.http.PersistentCookieStore;

/**
 * code from AsyncHttpClient(https://github.com/loopj/android-async-http)
 * 
 * @author ligl01
 * 
 */
public class LHttpClient {
	public static boolean DEBUG = true;
	
	public static final String HEADER_CONTENT_TYPE = "Content-Type";
	public static final String HEADER_CONTENT_RANGE = "Content-Range";
	public static final String HEADER_CONTENT_ENCODING = "Content-Encoding";
	public static final String HEADER_CONTENT_DISPOSITION = "Content-Disposition";
	public static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";
	public static final String ENCODING_GZIP = "gzip";

	public static final int DEFAULT_MAX_CONNECTIONS = 10;
	public static final int DEFAULT_TIMEOUT = 10 * 1000;
	public static final int DEFAULT_SOCKET_TIMEOUT = 10 * 1000;
	public static final int DEFAULT_MAX_RETRIES = 5;
	public static final int DEFAULT_RETRY_SLEEP_TIME_MILLIS = 1500;
	public static final int DEFAULT_SOCKET_BUFFER_SIZE = 8192;

	private int maxConnections = DEFAULT_MAX_CONNECTIONS;
	private int connectTimeout = DEFAULT_TIMEOUT;
	private int responseTimeout = DEFAULT_SOCKET_TIMEOUT;

	private final DefaultHttpClient httpClient;
	private final HttpContext httpContext;
	private final Map<String, String> clientHeaderMap;

	public LHttpClient() {
		this(80, 443);
	}

	public LHttpClient(int httpPort, int httpsPort) {
		BasicHttpParams httpParams = new BasicHttpParams();

		ConnManagerParams.setTimeout(httpParams, connectTimeout);
		ConnManagerParams.setMaxConnectionsPerRoute(httpParams,
				new ConnPerRouteBean(maxConnections));
		ConnManagerParams.setMaxTotalConnections(httpParams,
				DEFAULT_MAX_CONNECTIONS);

		HttpConnectionParams.setSoTimeout(httpParams, responseTimeout);
		HttpConnectionParams.setConnectionTimeou
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值