HttpClient你認(rèn)為就是幾句代碼就解決了??

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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容