HttpClient你認(rèn)為就是幾句代碼就解決了??如果你這樣想,那你只是處于網(wǎng)絡(luò)學(xué)習(xí)階段了(能夠完成網(wǎng)絡(luò)請(qǐng)求的功能而已),還沒(méi)有達(dá)到項(xiàng)目級(jí)別,雖然現(xiàn)在Android studio中HttpClient已經(jīng)不讓開(kāi)發(fā)者使用,但是HttpClient的使用范圍依然廣泛,不說(shuō)空話(huà)了,直接貼代碼出來(lái)看看。
這就是那簡(jiǎn)單的幾段代碼,就能夠完成HttpClient的GET請(qǐng)求:
try{
? ? ? ? ?//創(chuàng)建一個(gè)默認(rèn)的HttpClient
? ? ? ? ? ?HttpClient httpclient=new DefaultHttpClient();
? ? ? ? ? //創(chuàng)建一個(gè)GET請(qǐng)求
? ? ? ? ? ? HttpGet request=new HttpGet("www.nsusoft.com");
? ? ? ? ? ? ?//發(fā)送GET請(qǐng)求
? ? ? ? ? ? HttpResponse response = httpClient.execute(request);
}catch(Exception e) {
? ? ? ? ? ?e.printStackTrace();
}
但是這段代碼中:
HttpClient ?httpclient = new DefaultHttpClient();
? ? 這段代碼,讓我們沒(méi)有考慮到真實(shí)環(huán)境,如代碼的容錯(cuò)等等
? ? 其實(shí)在發(fā)送HTTP通信請(qǐng)求是,很可能在很多地方都能夠運(yùn)用到,我們其實(shí)不用每個(gè)請(qǐng)求都在創(chuàng)建一個(gè)HttpClient,HttpClient就像一個(gè)小的瀏覽器,對(duì)整個(gè)應(yīng)用只需要,創(chuàng)建一個(gè)HttpClient就夠了。
packagecom.caishaohua.internet.request;
importorg.apache.http.client.HttpClient;
importorg.apache.http.impl.client.DefaultHttpClient;
/**
* Created by Administrator on 2016/6/19.
*/
public classCustomerHttpClient {
? ? ? ? ?private staticHttpClientcustomerHttpClient;
? ? ? ? ?privateCustomerHttpClient(){}
? ? ? ? ?public staticHttpClient getHttpClient(){
? ? ? ? ? ? ? ? if(null==customerHttpClient){
? ? ? ? ? ? ? ? ? ? ? customerHttpClient=newDefaultHttpClient();
? ? ? ? ? ? ? ?}
? ? ? ? ? returncustomerHttpClient;
? ? ? ? }
}
但是當(dāng)我們需要有多個(gè)請(qǐng)求咋辦?我們會(huì)很容易想到使用多線(xiàn)程來(lái)完成,我們的應(yīng)用程序使用同一個(gè)HttpClient來(lái)管理所有的Http請(qǐng)求,一旦出現(xiàn)并發(fā)請(qǐng)求,那么一定會(huì)出現(xiàn)多線(xiàn)程的問(wèn)題。其實(shí)HttpClient提供了創(chuàng)建線(xiàn)程安全對(duì)象的API讓我們調(diào)用:
packagecom.caishaohua.internet.request;
importorg.apache.http.HttpVersion;
importorg.apache.http.client.HttpClient;
importorg.apache.http.conn.ClientConnectionManager;
importorg.apache.http.conn.params.ConnManagerParams;
importorg.apache.http.conn.scheme.PlainSocketFactory;
importorg.apache.http.conn.scheme.Scheme;
importorg.apache.http.conn.scheme.SchemeRegistry;
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.HttpParams;
importorg.apache.http.params.HttpProtocolParams;
importorg.apache.http.protocol.HTTP;
importorg.apache.http.protocol.HttpProcessor;
/**
* Created by Administrator on 2016/6/19.
*/
public class SafetyCustomerHttpClient {
? ? ? ? ?private static final String CHARSET= HTTP.UTF_8;
? ? ? ? ?private static HttpClient custormerHttpClient;
? ? ? ? ?private SafetyCustomerHttpClient(){
? ? ? ? ? ? ? }
? ? ? ? ? public static synchronized ?HttpClient getHttpClient(){
? ? ? ? ? ? ? if(null==custormerHttpClient){
? ? ? ? ? ? ? ? ?HttpParams httpParams =new BasicHttpParams();
? ? ? ? ? ? ? ? ?//設(shè)置基本參數(shù)
? ? ? ? ? ? ? ? ? HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
? ? ? ? ? ? ? ? ? HttpProtocolParams.setContentCharset(httpParams,CHARSET);
? ? ? ? ? ? ? ? ? ?HttpProtocolParams.setUseExpectContinue(httpParams,true);
? ? ? ? ? ? ? ? ? ?HttpProtocolParams.setUserAgent(httpParams,""+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0");
? ? ? ? ? ? ? ? ? //超時(shí)設(shè)置
? ? ? ? ? ? ? ? ? //從連接池獲取連接的超時(shí)時(shí)間
? ? ? ? ? ? ? ? ? ?ConnManagerParams.setTimeout(httpParams,8000);
? ? ? ? ? ? ? ? ?//連接超時(shí)
? ? ? ? ? ? ? ? ? HttpConnectionParams.setConnectionTimeout(httpParams,8000);
? ? ? ? ? ? ? ? ?//請(qǐng)求超時(shí)
? ? ? ? ? ? ? ? ? ?HttpConnectionParams.setSoTimeout(httpParams,8000);
? ? ? ? ? ? ? ? ? ?//這種HttpClient支持http和https兩種模式
? ? ? ? ? ? ? ? ? ? SchemeRegistry ?schemeRegistry =new SchemeRegistry();
? ? ? ? ? ? ? ? ? ? schemeRegistry.register(newScheme("http", PlainSocketFactory.getSocketFactory(),80));
? ? ? ? ? ? ? ? ? ?schemeRegistry.register(newScheme("https",PlainSocketFactory.getSocketFactory(),443));
? ? ? ? ? ? ? ? ? //使用線(xiàn)程安全的連接管理來(lái)創(chuàng)建HttpClient
? ? ? ? ? ? ? ? ?ClientConnectionManager connectionManager =new ?ThreadSafeClientConnManager(httpParams,schemeRegistry);
? ? ? ? ? ? ? ? ?custormerHttpClient=new DefaultHttpClient(connectionManager,httpParams);
? ? ? ? ? ? }
? ? ? ? ? ? returncustormerHttpClient;
? ? ? ? ? }
}
在代碼中,通過(guò)getHttpClient方法給HttpClient配置基本的設(shè)置,然后在使用ThreadSafeClientConnManager()來(lái)創(chuàng)建HttpClient。