androidhttpasync
㈠ android-async-http 支持https嗎
這幾天由於項目要求將http轉換成https請求,要求不做證書驗證。而我使用的是loopj的開源庫android-async-http來完成伺服器請求,但是此庫並未有相關https的示例,故自己動手豐衣足食。
經過一番摸索,現記錄如下:
封裝了一個httpclient幫助類,以此獲取一個DefaultHttpClient的示例對象。
[java] view
plainprint?
importjava.io.IOException;
importjava.net.Socket;
importjava.net.UnknownHostException;
importjava.security.KeyManagementException;
importjava.security.KeyStore;
importjava.security.KeyStoreException;
importjava.security.NoSuchAlgorithmException;
importjava.security.UnrecoverableKeyException;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.TrustManager;
importjavax.net.ssl.X509TrustManager;
importorg.apache.http.HttpVersion;
importorg.apache.http.conn.ClientConnectionManager;
importorg.apache.http.conn.params.ConnManagerParams;
importorg.apache.http.conn.params.ConnPerRouteBean;
importorg.apache.http.conn.scheme.PlainSocketFactory;
importorg.apache.http.conn.scheme.Scheme;
importorg.apache.http.conn.scheme.SchemeRegistry;
importorg.apache.http.conn.ssl.SSLSocketFactory;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
importorg.apache.http.params.BasicHttpParams;
importorg.apache.http.params.HttpConnectionParams;
importorg.apache.http.params.HttpProtocolParams;
/**
*@authorAdministrator
*注意所導入的包,故將引入的包也貼上,防止錯誤。
*/
publicclassHttpClientHelper{
;
="1.1";
/**http請求最大並發連接數*/
privatestaticfinalintDEFAULT_MAX_CONNECTIONS=10;
/**超時時間,默認10秒*/
privatestaticfinalintDEFAULT_SOCKET_TIMEOUT=30*1000;
/**默認的套接字緩沖區大小*/
privatestaticfinalintDEFAULT_SOCKET_BUFFER_SIZE=8192;
=DEFAULT_MAX_CONNECTIONS;
privatestaticintsocketTimeout=DEFAULT_SOCKET_TIMEOUT;
privateHttpClientHelper(){
}
(){
if(null==httpClient){
//初始化工作
try{
KeyStoretrustStore=KeyStore.getInstance(KeyStore
.getDefaultType());
trustStore.load(null,null);
BasicHttpParamshttpParams=newBasicHttpParams();
ConnManagerParams.setTimeout(httpParams,socketTimeout);
ConnManagerParams.setMaxConnectionsPerRoute(httpParams,
newConnPerRouteBean(maxConnections));
ConnManagerParams.setMaxTotalConnections(httpParams,
DEFAULT_MAX_CONNECTIONS);
HttpConnectionParams.setSoTimeout(httpParams,socketTimeout);
HttpConnectionParams.setConnectionTimeout(httpParams,
socketTimeout);
HttpConnectionParams.setTcpNoDelay(httpParams,true);
HttpConnectionParams.setSocketBufferSize(httpParams,
DEFAULT_SOCKET_BUFFER_SIZE);
HttpProtocolParams.setVersion(httpParams,HttpVersion.HTTP_1_1);
HttpProtocolParams.setUserAgent(httpParams,String
.format("thinkandroid/%s(http://www.thinkandroid.cn)",
VERSION));
//設置https支持
SSLSocketFactorysf=newSSLSocketFactoryEx(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);//允許所有主機的驗證
SchemeRegistryschReg=newSchemeRegistry();
schReg.register(newScheme("http",PlainSocketFactory
.getSocketFactory(),80));
schReg.register(newScheme("https",sf,443));
schReg.register(newScheme("https",sf,8443));
=(
httpParams,schReg);
httpClient=newDefaultHttpClient(conManager,httpParams);
}catch(Exceptione){
e.printStackTrace();
returnnewDefaultHttpClient();
}
}
returnhttpClient;
}
}
然後在開源庫的AsyncHttpClient類中將原來的
httpClient = new DefaultHttpClient(cm, httpParams)替換成httpClient =
HttpClientHelper.getHttpClient()即可。
這個封裝類大家可以拿去用的。只要是不做證書驗證。如果需要載入證書驗證的,對客戶端來說比較簡單。可以去google下。
轉載
㈡ android-async-http 怎麼支持patch方法
先來看一下最基本的用法
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
通過AsyncHttpClient類的實例就可以執行網路請求,包括get、put、post、head、delete。並指定一個ResponseHandlerInterface的實例接收請求結果。(onSuccess參數不對,此處只說明基本用法,詳細參數看源碼)
主要類介紹
AsyncHttpRequest
繼承自Runnabler,被submit至線程池執行網路請求並發送start,success等消息
AsyncHttpResponseHandler
接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息
TextHttpResponseHandler
繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數組轉換為String
JsonHttpResponseHandler
繼承自TextHttpResponseHandler,同樣是重寫onSuccess和onFailure方法,將請求結果由String轉換為JSONObject或JSONArray
BaseJsonHttpResponseHandler
繼承自TextHttpResponseHandler,是一個泛型類,提供了parseResponse方法,子類需要提供實現,將請求結果解析成需要的類型,子類可以靈活地使用解析方法,可以直接原始解析,使用gson等。
RequestParams
請求參數,可以添加普通的字元串參數,並可添加File,InputStream上傳文件
AsyncHttpClient
核心類,使用HttpClient執行網路請求,提供了get,put,post,delete,head等請求方法,使用起來很簡單,只需以url及RequestParams調用相應的方法即可,還可以選擇性地傳入Context,用於取消Content相關的請求,同時必須提供ResponseHandlerInterface(AsyncHttpResponseHandler繼承自ResponseHandlerInterface)的實現類,一般為AsyncHttpResponseHandler的子類,AsyncHttpClient內部有一個線程池,當使用AsyncHttpClient執行網路請求時,最終都會調用sendRequest方法,在這個方法內部將請求參數封裝成AsyncHttpRequest(繼承自Runnable)交由內部的線程池執行。
SyncHttpClient
繼承自AsyncHttpClient,同步執行網路請求,AsyncHttpClient把請求封裝成AsyncHttpRequest後提交至線程池,SyncHttpClient把請求封裝成AsyncHttpRequest後直接調用它的run方法。
㈢ android-async-http 怎麼用
examples:裡面有簡單的例子
library:裡面存放的是android-async-http開源項目的源碼(方法一:可以把library\src\main\Java文件下面的文件拷貝到,你應用的src下也可以直接使用)
releases:裡面存放的是各個版本的jar文件,(方法二:只需把最新的jar文件拷貝到你應用的libs目錄下即可.)
samples:裡面存放的也是例子(可供參考)
備註:方法一和方法二隻能採用其中之一,建議採用方法二
2.2使用方法
Import the http package.
import com.loopj.android.http.*;
Create a new AsyncHttpClient instance and make a request:
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
Adding GET/POST Parameters with RequestParams
The RequestParams class is used to add optional GET or POST parameters to your requests.RequestParams can be built and constructed in various ways:
Create empty RequestParams and immediately add some parameters:
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
Create RequestParams for a single parameter:
RequestParams params = new RequestParams("single", "value");
Create RequestParams from an existing Map of key/value strings:
HashMap<String, String> paramMap = new HashMap<String, String>();
paramMap.put("key", "value");
RequestParams params = new RequestParams(paramMap);
See the RequestParams Javadoc for more information.
Add an InputStream to the RequestParams to upload:
InputStream myInputStream = blah;
RequestParams params = new RequestParams();
params.put("secret_passwords", myInputStream, "passwords.txt");
Add a File object to the RequestParams to upload:
File myFile = new File("/path/to/file.png");
RequestParams params = new RequestParams();
try {
params.put("profile_picture", myFile);
} catch(FileNotFoundException e) {}
Add a byte array to the RequestParams to upload:
byte[] myByteArray = blah;
RequestParams params = new RequestParams();
params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");
See the RequestParams Javadoc for more information.
Downloading Binary Data with BinaryHttpResponseHandler
The BinaryHttpResponseHandler class can be used to fetch binary data such as images and other files. For example:
AsyncHttpClient client = new AsyncHttpClient();
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" };
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) {
@Override
public void onSuccess(byte[] fileData) {
// Do something with the file
}
});
㈣ 如何添加android-async-http源碼
簡單來說你只需要3步,
1. 創建一個AsyncHttpClient;
2. (可選的)通過RequestParams對象設置請求參數;
3. 調用AsyncHttpClient的某個get方法,傳遞你需要的(成功和失敗時)callback介面實現,一般都是匿名內部類
,實現了AsyncHttpResponseHandler,類庫自己也提供了好些現成的response
handler,你一般不需要自己創建一個。
來看看代碼如何寫:
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onStart() {
// called before request is started
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response)
{
// called when response HTTP status is "200 OK"
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[]
errorResponse, Throwable e) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
@Override
public void onRetry(int retryNo) {
// called when request is retried
}
});
是不是很簡潔,有沒有被震撼到?反正我自己第一次看到的時候有種相見恨晚的感覺,這簡直就是我日思夜想的方式啊!這里你只需要通過
匿名內部類的方式實現AsyncHttpResponseHandler,而且更棒的是你只需要override感興趣的方法,比如一般都是onSuccess和onFailure。
這個版本的get方法沒有為請求傳遞任何參數,當然你也可以通過RequestParams來傳遞各種參數,如下:
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.get("http://www.google.com", params, new
AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response)
{
System.out.println(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[]
responseBody, Throwable error) {
Log.d("ERROR", error);
}
}
);
以上的例子是返回的response直接是原生位元組流的情況,如果你需要把返回的結果當一個String對待,這時只需要匿名實現一個
TextHttpResponseHandler就行,其繼承自AsyncHttpResponse,並將原生的位元組流根據指定的encoding轉化成了string對象,
代碼如下:
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.get("http://www.google.com", params, new
TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String response)
{
System.out.println(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, String
responseBody, Throwable error) {
Log.d("ERROR", error);
}
}
);
同樣的方式,你可以發送json請求,代碼如下:
String url = "https://ajax.googleapis.com/ajax/services/search/images";
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("q", "android");
params.put("rsz", "8");
client.get(url, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject
response) {
// Handle resulting parsed JSON response here
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response)
{
// Handle resulting parsed JSON response here
}
});
看到了沒,返回的response已經自動轉化成JSONObject了,當然也支持JSONArray類型,override你需要的那個版本就行。
有了AsyncHttpClient,要實現這些功能是不是很簡單呢?當然這里只是很初級的介紹和使用,剩下的還需要開發者自己參考官方
文檔、源碼(官方甚至提供了一個Sample使用的集合),在實際項目中實踐。最後,強烈建議大家使用,是時候和冗長乏味的代碼說
㈤ 怎麼使用android-async-http給後台上傳json數據
一、在JavaEE項目中搭建環境
1. 導入相關jar包
2. 搭建相關的包和類
3.類中的方法簡單實現
User:
聲明以下屬性,並實現無參構造器和有參構造器,以及各自的get和set方法
UserDao:
UserDaoImpl:
JsonServlet:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 來自於資料庫
UserDao Impl = new UserDaoImpl();
List entities = Impl.findAll();
// 把List集合轉換成一個json的數據格式
JSONArray jsonArray = JSONArray.fromObject(entities);
response.setContentType("application/json");// 響應類型 json的數據
response.getWriter().write(jsonArray.toString());
response.getWriter().close();
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
附上出處鏈接:http://www.2cto.com/kf/201405/304410.html
㈥ 框架android-async-http 伺服器怎麼接受文件
在服務端,比如servlet,從requset里拿到inputStream,從流裡面讀取,然後生成文件
㈦ okhttp,retrofit,android-async-http,volley應該選擇哪一個
個人認為okhttp是android平台最好的網路庫。
volley是一個簡單的非同步http庫,僅此而已。缺點是不支持同步,這點會限制開發模式;不能post大數據,所以不適合用來上傳文件。
android-async-http,與volley一樣是非同步網路庫。但volley是封裝的httpUrlConnection,它是封裝的httpClient,而android平台不推薦用HttpClient了,所以這個庫已經不適合android平台了。
okhttp是高性能的http庫,支持同步、非同步,而且實現了spdy、http2、websocket協議,api很簡潔易用,和volley一樣實現了http協議的緩存。picasso就是利用okhttp的緩存機制實現其文件緩存,實現的很優雅,很正確,反例就是UIL(universal image loader),自己做的文件緩存,而且不遵守http緩存機制。
retrofit與picasso一樣都是在okhttp基礎之上做的封裝,項目中可以直接用了。
㈧ android-async-http訪問https的地址,怎麼使用
簡單來說你只需要3步,
1/ajax/services/search/images";
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("q", "android");
params.put("rsz", "8");
client.get(url, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject
response) {
// Handle resulting parsed JSON response here
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response)
{
// Handle resulting parsed JSON response here
}
});
看到了沒,返回的response已經自動轉化成JSONObject了,當然也支持JSONArray類型,override你需要的那個版本就行。
有了AsyncHttpClient,要實現這些功能是不是很簡單呢?當然這里只是很初級的介紹和使用,剩下的還需要開發者自己參考官方
文檔、源碼(官方甚至提供了一個Sample使用的集合),在實際項目中實踐。最後,強烈建議大家使用,是時候和冗長乏味的代碼說
㈨ 如何處理Android-Async-Http連接超時的問題
一般網路超時後,可以嘗試重新連接,或者給出錯誤提示。
Android-Async-Http第三方的網路請求框架,內部已經默認實現了,二次請求網路,就是在網路錯誤後再請求一次伺服器。所以可以直接給出錯誤提示,讓用戶檢查網路。
㈩ 安卓ion與android-async-http哪個框架更好用
android-async-http 開源框架可以使我們輕松地獲取網路數據或者向伺服器發送數據,最關鍵的是,它是非同步框架,在底層使用線程池處理並發請求,效率很高,使用又特別簡單。
以往我們在安卓上做項目,比如要下載很多圖片、網頁或者其他的資源,多數開發者會選擇一個線程一個下載任務這種模型,因為安卓自帶的 AndroidHttpClient 或者 java 帶的 java.net.URL ,默認都是阻塞式操作。這種模型效率不高,對並發要求高的 APP 來講,並不適用。有的人會選擇使用 nio 自己實現,代碼復雜度又很高。
AsyncHttpClient 作為 android-async-http 框架的一個核心應用類,使用簡單,可以處理文本、二進制等各種格式的 web 資源。下面提供一些代碼來看如何使用:
public class Downloader {
public static AsyncHttpClient mHttpc = new AsyncHttpClient();
public static String TAG = "Downloader";
public void downloadText(String uri){
mHttpc.get(uri, null, new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String data){
Log.i(TAG, "downloaded, thread id " + Thread.currentThread().getId());
// TODO: do something on
}
@Override
public void onFailure(Throwable e, String data){
Log.i(TAG, "download failed.");
// TODO: error proceed