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