1. 程式人生 > >HttpClient與HttpURLConnection

HttpClient與HttpURLConnection

一、HttpClient

Android SDK中包含了HttpClient,在Android6.0版本直接刪除了HttpClient類庫,如果仍想使用則解決方法是:

  • 如果使用的是eclipse則在libs中加入org.apache.http.legacy.jar
    這個jar包在:**sdk\platforms\android-23\optional目錄中(需要下載android
    6.0的SDK)
  • 如果使用的是android studio則 在相應的module下的build.gradle中加入:
android{
useLibrary 'org.apache.http.legacy'

}

HttpClient的GET請求

首先我們來用DefaultHttpClient類來例項化一個HttpClient,並配置好預設的請求引數:

//建立HttpClient

private HttpClient createHttpClient() {

HttpParams mDefaultHttpParams = new BasicHttpParams();

//設定連線超時

HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000);

//設定請求超時

HttpConnectionParams.setSoTimeout(mDefaultHttpParams,

15000);

HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true);

HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1);

HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8);

//持續握手

HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true);

HttpClient mHttpClient =

new DefaultHttpClient(mDefaultHttpParams);

return mHttpClient;

}

接下來建立HttpGet和HttpClient,請求網路並得到HttpResponse,並對HttpResponse進行處理:

private void useHttpClientGet(String url) {

HttpGet mHttpGet = new HttpGet(url);

mHttpGet.addHeader("Connection", "Keep-Alive");

try {

HttpClient mHttpClient = createHttpClient();

HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);

HttpEntity mHttpEntity = mHttpResponse.getEntity();

int code = mHttpResponse.getStatusLine().getStatusCode();

if (null != mHttpEntity) {

InputStream mInputStream = mHttpEntity.getContent();

String respose = converStreamToString(mInputStream);

Log.i("wangshu", "請求狀態碼:" + code + "\n請求結果:\n" + respose);

mInputStream.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

converStreamToString方法將請求結果轉換成String型別:

private String converStreamToString(InputStream is) throws IOException {
      BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      StringBuffer sb = new StringBuffer();
      String line = null;
      while ((line = reader.readLine()) != null) {
         sb.append(line + "\n");
      }
      String respose = sb.toString();
      return respose;
}
最後我們開啟執行緒訪問百度:
new Thread(new Runnable() {
@Override
public void run() {
      useHttpClientGet("http://www.baidu.com");
      }
}).start();
請求的返回結果,請求狀態碼為200,結果就是個html頁,這裡只截取了部分html程式碼:
GET請求的引數暴露在URL中,這有些不大妥當,而且URL的長度也有限制:長度在2048字元之內,在HTTP 1.1後URL長度才沒有限制。一般情況下POST可以替代GET,接下來我們來看看HttpClient的POST請求。

HttpClient的POST請求

post請求和get類似就是需要配置要傳遞的引數:

private void useHttpClientPost(String url) {
   HttpPost mHttpPost = new HttpPost(url);
   mHttpPost.addHeader("Connection", "Keep-Alive");
   try {
      HttpClient mHttpClient = createHttpClient();
      List<NameValuePair> postParams = new ArrayList<>();
      //要傳遞的引數
postParams.add(new BasicNameValuePair("username", "moon"));
      postParams.add(new BasicNameValuePair("password", "123"));
      mHttpPost.setEntity(new UrlEncodedFormEntity(postParams));
      HttpResponse mHttpResponse = mHttpClient.execute(mHttpPost);
      HttpEntity mHttpEntity = mHttpResponse.getEntity();
      int code = mHttpResponse.getStatusLine().getStatusCode();
      if (null != mHttpEntity) {
         InputStream mInputStream = mHttpEntity.getContent();
         String respose = converStreamToString(mInputStream);
         Log.i("wangshu", "請求狀態碼:" + code + "\n請求結果:\n" + respose);
         mInputStream.close();
      }
   } catch (IOException e) {
      e.printStackTrace();
   }
}
因為我們要傳送POST請求,所以在UrlConnManager類中再寫一個postParams()方法用來組織一下請求引數並將請求引數寫入到輸出流中:

public static void postParams(OutputStream output,List<NameValuePair>paramsList) throws IOException{
   StringBuilder mStringBuilder=new StringBuilder();
   for (NameValuePair pair:paramsList){
      if(!TextUtils.isEmpty(mStringBuilder)){
         mStringBuilder.append("&");
      }
      mStringBuilder.append(URLEncoder.encode(pair.getName(),"UTF-8"));
      mStringBuilder.append("=");
      mStringBuilder.append(URLEncoder.encode(pair.getValue(),"UTF-8"));
   }
   BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(output,"UTF-8"));
   writer.write(mStringBuilder.toString());
   writer.flush();
   writer.close();
}
接下來我們新增請求引數,呼叫postParams()方法將請求的引數組織好傳給HttpURLConnection的輸出流,請求連線並處理返回的結果:
private void useHttpUrlConnectionPost(String url) {
   InputStream mInputStream = null;
   HttpURLConnection mHttpURLConnection = UrlConnManager.getHttpURLConnection(url);
   try {
      List<NameValuePair> postParams = new ArrayList<>();
      //要傳遞的引數
postParams.add(new BasicNameValuePair("username", "moon"));
      postParams.add(new BasicNameValuePair("password", "123"));
      UrlConnManager.postParams(mHttpURLConnection.getOutputStream(), postParams);
      mHttpURLConnection.connect();
      mInputStream = mHttpURLConnection.getInputStream();
      int code = mHttpURLConnection.getResponseCode();
      String respose = converStreamToString(mInputStream);
      Log.i("wangshu", "請求狀態碼:" + code + "\n請求結果:\n" + respose);
      mInputStream.close();
   } catch (IOException e) {
      e.printStackTrace();
   }
}
最後開啟執行緒請求網路:

private void useHttpUrlConnectionGetThread() {
new Thread(new Runnable() {
@Override
public void run() {
      useHttpUrlConnectionPost("http://www.baidu.com");
      }
      }).start();
}


相關推薦

HttpClientHttpURLConnection的提交資料

使用HttpClient提交資料(get) //get提交 public void click1(View view) throws Exception{ final String username = et_text1.getText().toString()

HttpClientHttpURLConnection

一、HttpClient Android SDK中包含了HttpClient,在Android6.0版本直接刪除了HttpClient類庫,如果仍想使用則解決方法是: 如果使用的是eclipse則在libs中加入org.apache.http.legacy.jar 這個

HTTP基礎Android之——使用HttpClientHttpURLConnection

1、客戶端連線伺服器實現內部的原理: 分析上圖,步驟如下: 第一步:在瀏覽器客戶端中得到使用者輸入的內容。 第二步:瀏覽器得到這個網址之後,內部會將這個域名傳送到DNS上,進行域名解析。得到它的IP之後就會連結到指定的伺服器上,假如伺服器的地址是:221.104.13.32:80,從瀏覽器

HttpclientRestTemplate的比較(比httpClient更優雅的Restful URL訪問)

user urlencode exe exc 構造 sage pty utf-8 charset 一、HttpClient (一)HttpClient 客戶端 1、HttpClient 是 apache 的開源,需要引入兩個包:httpclient-4.2.4.jar 和

HttpClientHttpURLConnection的使用和區別

https://www.cnblogs.com/liushuibufu/p/4140913.html   功能用法對比 從功能上對比,HttpURLConnection比HttpClient庫要豐富很多,提供了很多工具,封裝了http的請求頭,引數,內容體,響應,還有一

HttpClientHttpURLConnection的區別和案例

HttpURLConnection 物件 1. HttpURLConnection物件需要通過URL類中的openConnection()方法來獲得,它無法直接構造。 HttpsURLConnection urlconn = null; URL url = new UR

【轉】關於HttpClientHttpURLConnection,OkHttp的用法整理

1 HttpClient入門例項 2 HttpURLConnection入門例項 其中文章提到的is2String(inputStream)讀取響應結果,可參考如下寫法 // 得到響應

HttpClientHttpURLConnection、OKHttp和Volley優缺點和效能對比,如何選擇?

HttpURLConnection是一個多用途、輕量級的http客戶端。它對網路請求的封裝沒有HttpClient徹底,api比較簡單,用起來沒有那麼方便。但是正是由於此,使得我們能更容易的擴充套件和優化的HttpURLConnection。不過,再android2.2之前一直存在著一些令人煩的bug,比如一

HttpClientHttpURLConnection整合彙總對比

總結了網上的一些資源,主要有以下兩個觀點: 分析一:             在研究Volley框架的原始碼中,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。我也比較

HttpClientHttpURLConnection 共用session

最近又開始折騰android專案了,專案中需要請求伺服器段的介面,又要涉及到圖片的資源,比較糾結的是,我開始著手這個專案的時候,網路請求的框架已經完成了,現在存在一個問題就是,請求介面的使用的是HttpClient,這個是已經封裝好了,不方便修改的,但是圖片下載,如果這套

HttpClientHtmlParse完美融合簡單例項

當然第一步當然是去網上下載Jar包啦,相信這個應該都會吧!收索HttpClient下載收索HtmlParse下載簡單例項程式碼:package com.fldyown.advertisement;import org.apache.http.HttpEntity;import

Android4種網路連線方式HttpClientHttpURLConnection、OKHttp和Volley優缺點和效能對比

比較的指標: 1、cpu 2、流量 3、電量 4、記憶體佔用 5、聯網時間 功能點: 1、重試機制 2、提供的擴充套件功能 3、易用性 4、是否https 5、是否支援reflect api,OkHttp有配套方法 6、快取、重試 7、cookie支援

HttpClientHttpURLConnection獲取伺服器返回的內容

HttpClient: /** * 獲取賬號密碼介面的網頁原始碼 * @return */ private String getAccountPasswordHtml() { HttpClient ht

贈送 HttpClientHttpURLConnection 的輕型網路框架 ---》使用介紹

之前看網上的一些網路框架,多少存在一些bug,大多還沒有原始碼,有些有原始碼,框架過於太大,發現了bug修改起來也實在費事,所以使用自己的網路框架是最佳選擇哦,這個框架我這裡有借鑑一些其他框架的地方,不過提供功能就是   post  請求網路。 Android使用 Ht

HttpClientHttpURLConnection哪個更好

最近在研究Volley框架的原始碼,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。我也比較好奇這麼使用的原因,於是專門找到了一位Google的工程師寫的一篇部落格,

HttpClientHttpURLConnection的區別

簡單而言HttpClient就是加強版的HttpURLConnection,但是HttpClient能夠維護客戶端和服務端的Session。 宣告:轉載自:http://blog.csdn.net/hguang_zjh/article/details/33743249

HttpClientHttpURLConnection網路請求資料

public class MainActivity extends Activity { // 全域性 NewsData newsData; private Button btn1, btn2; private ListView list; private MyAda

HttpURLConnectionHttpClient隨筆

stat getent 網絡訪問 淺析 細節 dom b站 word for   目前在工作中遇到的需要各種對接接口的工作,需要用到HTTP的知識,工作完成後想要做一些筆記,本來知識打算把自己寫的代碼粘貼上來就好了,但是偶然發現一篇博文對這些知識的總結非常到位,自認無法寫的

HttpURLConnectionHttpClient學習

就是 int main head title tac localhost local net 轉載HttpURLConnection與HttpClient淺析 一、HttpURLConnection的使用 import org.slf4j.Logger; import o

HttpURLConnectionHttpClient 區別及聯絡

httpclient其實在網路程式設計中,基於java的實現,幾乎都包裝了socket的通訊,然後模擬各總各樣的協議,httpclient其實是模擬瀏覽器發起像伺服器的請求 http://blog.csdn.net/zhliro/article/details