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中加入:
useLibrary 'org.apache.http.legacy'
}
HttpClient的GET請求
首先我們來用DefaultHttpClient類來例項化一個HttpClient,並配置好預設的請求引數:
//建立HttpClient
private
HttpClient createHttpClient()
{
HttpParams mDefaultHttpParams = new BasicHttpParams();
//設定連線超時
HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000);
//設定請求超時
HttpConnectionParams.setSoTimeout(mDefaultHttpParams,
HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true);
HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8);
//持續握手
HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true);
HttpClient mHttpClient
=
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(); }
相關推薦
HttpClient與HttpURLConnection的提交資料
使用HttpClient提交資料(get) //get提交 public void click1(View view) throws Exception{ final String username = et_text1.getText().toString()
HttpClient與HttpURLConnection
一、HttpClient Android SDK中包含了HttpClient,在Android6.0版本直接刪除了HttpClient類庫,如果仍想使用則解決方法是: 如果使用的是eclipse則在libs中加入org.apache.http.legacy.jar 這個
HTTP基礎與Android之——使用HttpClient和HttpURLConnection
1、客戶端連線伺服器實現內部的原理: 分析上圖,步驟如下: 第一步:在瀏覽器客戶端中得到使用者輸入的內容。 第二步:瀏覽器得到這個網址之後,內部會將這個域名傳送到DNS上,進行域名解析。得到它的IP之後就會連結到指定的伺服器上,假如伺服器的地址是:221.104.13.32:80,從瀏覽器
Httpclient與RestTemplate的比較(比httpClient更優雅的Restful URL訪問)
user urlencode exe exc 構造 sage pty utf-8 charset 一、HttpClient (一)HttpClient 客戶端 1、HttpClient 是 apache 的開源,需要引入兩個包:httpclient-4.2.4.jar 和
HttpClient和HttpURLConnection的使用和區別
https://www.cnblogs.com/liushuibufu/p/4140913.html 功能用法對比 從功能上對比,HttpURLConnection比HttpClient庫要豐富很多,提供了很多工具,封裝了http的請求頭,引數,內容體,響應,還有一
HttpClient和HttpURLConnection的區別和案例
HttpURLConnection 物件 1. HttpURLConnection物件需要通過URL類中的openConnection()方法來獲得,它無法直接構造。 HttpsURLConnection urlconn = null; URL url = new UR
【轉】關於HttpClient,HttpURLConnection,OkHttp的用法整理
1 HttpClient入門例項 2 HttpURLConnection入門例項 其中文章提到的is2String(inputStream)讀取響應結果,可參考如下寫法 // 得到響應
HttpClient、HttpURLConnection、OKHttp和Volley優缺點和效能對比,如何選擇?
HttpURLConnection是一個多用途、輕量級的http客戶端。它對網路請求的封裝沒有HttpClient徹底,api比較簡單,用起來沒有那麼方便。但是正是由於此,使得我們能更容易的擴充套件和優化的HttpURLConnection。不過,再android2.2之前一直存在著一些令人煩的bug,比如一
HttpClient和HttpURLConnection整合彙總對比
總結了網上的一些資源,主要有以下兩個觀點: 分析一: 在研究Volley框架的原始碼中,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。我也比較
HttpClient 和 HttpURLConnection 共用session
最近又開始折騰android專案了,專案中需要請求伺服器段的介面,又要涉及到圖片的資源,比較糾結的是,我開始著手這個專案的時候,網路請求的框架已經完成了,現在存在一個問題就是,請求介面的使用的是HttpClient,這個是已經封裝好了,不方便修改的,但是圖片下載,如果這套
HttpClient與HtmlParse完美融合簡單例項
當然第一步當然是去網上下載Jar包啦,相信這個應該都會吧!收索HttpClient下載收索HtmlParse下載簡單例項程式碼:package com.fldyown.advertisement;import org.apache.http.HttpEntity;import
Android4種網路連線方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和效能對比
比較的指標: 1、cpu 2、流量 3、電量 4、記憶體佔用 5、聯網時間 功能點: 1、重試機制 2、提供的擴充套件功能 3、易用性 4、是否https 5、是否支援reflect api,OkHttp有配套方法 6、快取、重試 7、cookie支援
HttpClient和HttpURLConnection獲取伺服器返回的內容
HttpClient: /** * 獲取賬號密碼介面的網頁原始碼 * @return */ private String getAccountPasswordHtml() { HttpClient ht
贈送 HttpClient 和HttpURLConnection 的輕型網路框架 ---》使用介紹
之前看網上的一些網路框架,多少存在一些bug,大多還沒有原始碼,有些有原始碼,框架過於太大,發現了bug修改起來也實在費事,所以使用自己的網路框架是最佳選擇哦,這個框架我這裡有借鑑一些其他框架的地方,不過提供功能就是 post 請求網路。 Android使用 Ht
HttpClient和HttpURLConnection哪個更好
最近在研究Volley框架的原始碼,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。我也比較好奇這麼使用的原因,於是專門找到了一位Google的工程師寫的一篇部落格,
HttpClient和HttpURLConnection的區別
簡單而言HttpClient就是加強版的HttpURLConnection,但是HttpClient能夠維護客戶端和服務端的Session。 宣告:轉載自:http://blog.csdn.net/hguang_zjh/article/details/33743249
HttpClient和HttpURLConnection網路請求資料
public class MainActivity extends Activity { // 全域性 NewsData newsData; private Button btn1, btn2; private ListView list; private MyAda
HttpURLConnection與HttpClient隨筆
stat getent 網絡訪問 淺析 細節 dom b站 word for 目前在工作中遇到的需要各種對接接口的工作,需要用到HTTP的知識,工作完成後想要做一些筆記,本來知識打算把自己寫的代碼粘貼上來就好了,但是偶然發現一篇博文對這些知識的總結非常到位,自認無法寫的
HttpURLConnection與HttpClient學習
就是 int main head title tac localhost local net 轉載HttpURLConnection與HttpClient淺析 一、HttpURLConnection的使用 import org.slf4j.Logger; import o
HttpURLConnection與HttpClient 區別及聯絡
httpclient其實在網路程式設計中,基於java的實現,幾乎都包裝了socket的通訊,然後模擬各總各樣的協議,httpclient其實是模擬瀏覽器發起像伺服器的請求 http://blog.csdn.net/zhliro/article/details