HttpURLConnection和HttpClient的使用

鋸齒流沙發表於2018-01-03

2013年末,剛剛開始學android開發的時候,都是使用HttpURLConnection和HttpClient來進行網路訪問的,現在網上一搜尋開源的網路訪問框架一大堆,比如OkHttpVolleyRetrofitrxjava等等。那麼HttpURLConnection和HttpClient有什麼區別呢?

android支援TCP和UDP通訊,但是應用程式大部分網路呼叫都是通過建立tcp之上的http請求完成的。android 提供了兩個的http通訊的API,就是apache的HttpClient和java的HttpUrlConnection,其實兩種都是提供相同的功能。

HttpURLConnection是繼承URLConnection的抽象類,是標準的java介面,比較輕量,使用大多數的應用程式。

使用HttpURLConnection進行http請求:

/* *  

* Get方式傳送請求 

*/

public Object sendGETRequest(String path, Mapparams,String ecoding) throws Exception{

StringBuilder url = new StringBuilder(path);

url.append("?");

for (Map.Entryentry : params.entrySet()) {

url.append(entry.getKey()).append("=");

url.append(URLEncoder.encode(entry.getValue(), ecoding));

url.append("&");

}

url.deleteCharAt(url.length() - 1);

HttpURLConnection conn = (HttpURLConnection) new URL(url.toString())

.openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

if (conn.getResponseCode() == 200) {

String sessionid = HttpUtils.queryStringForGet(url.toString());

InputStream inStream = conn.getInputStream();

return inStream;

}

return null;

}


/* *

* POST方式傳送請求

*/

public Object sendPOSTRequest(String path,Mapparams, String encoding) throws Exception {

StringBuilder data = new StringBuilder();

if (params != null && !params.isEmpty()) {

//搭建post訪問路徑 

for (Map.Entryentry : params.entrySet()) {

data.append(entry.getKey()).append("=");

data.append(URLEncoder.encode(entry.getValue(), encoding));

data.append("&");

}

data.deleteCharAt(data.length() - 1);

}

byte[] entity = data.toString().getBytes();

HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("POST");

conn.setDoOutput(true);// 允許對外輸出

conn.setRequestProperty("Content-Type",

"application/x-www-form-urlencoded");

conn.setRequestProperty("Content-Length", String.valueOf(entity.length));

OutputStream outputStream = conn.getOutputStream();

outputStream.write(entity);

if (conn.getResponseCode() == 200) {

InputStream inStream = conn.getInputStream();

return inStream;

}

return null;

}

HttpClient是apache公司提供的http協議庫,功能比較豐富,對http進行封裝和處理,所以比較難擴充套件。

/* 

* 通過url傳送get請求,第一次請求後儲存sessionID

*/

public static String queryStringForGet(String url){HttpGet httpGet = new HttpGet(url);

//例項化HttpGet物件

String result = null;

if (null!=JSPSESSID) {

//判斷sessionid是否為空,不為空就將jspsessionid的值放到cookie中傳送給伺服器httpGet.setHeader("Cookie","JSPSESSID="+JSPSESSID);}

//例項化連線

DefaultHttpClient httpClient = new DefaultHttpClient();

try {

//例項化返回結果

HttpResponse response = httpClient.execute(httpGet);

//返回狀態碼為200,表示成功

if (response.getStatusLine().getStatusCode()==200) {

result = EntityUtils.toString(response.getEntity(),HTTP.UTF_8);

CookieStore mCookieStore = httpClient.getCookieStore();

//取得cookiestore

List  list = mCookieStore.getCookies();

for (int i = 0; i < list.size(); i++) {

//取得cookie的JSPSESSID的值存在靜態變數中,保證每次都是同一個值

if ("JSPSESSID".equals(list.get(i).getName())) {

JSPSESSID = list.get(i).getValue();

}

}

return result;

}

} catch (ClientProtocolException e) {

e.printStackTrace();

}catch (IOException e) {

e.printStackTrace();}

return null;

}

}

public static String PATH = "http://伺服器的IP地址";

public static String JSPSESSID = null;//靜態變數用來儲存jspsessId的值

/* 

* 通過url傳送post請求,第一次請求後儲存sessionID

 */

public static String queryStringForPost(String url){

HttpPost httpPost = new HttpPost(url);

//例項化HttpPost物件

String result = null;

if (null!=JSPSESSID) {

//判斷sessionid是否為空,不為空就將jspsessionid的值放到cookie中傳送給伺服器httpPost.setHeader("Cookie","JSPSESSID="+JSPSESSID);

}

//例項化連線

DefaultHttpClient httpClient = new DefaultHttpClient();

try {

//例項化返回結果

HttpResponse response = httpClient.execute(httpPost);

//返回狀態碼為200,表示成功

if (response.getStatusLine().getStatusCode()==200) {

result = EntityUtils.toString(response.getEntity(),HTTP.UTF_8);

CookieStore mCookieStore = httpClient.getCookieStore();

//取得cookiestore

List list = mCookieStore.getCookies();

for (int i = 0; i < list.size(); i++) {

//取得cookie的JSPSESSID的值存在靜態變數中,保證每次都是同一個值

if ("JSPSESSID".equals(list.get(i).getName())) {

JSPSESSID = list.get(i).getValue();

}

}

return result;

}

} catch (ClientProtocolException e) {

e.printStackTrace();

}catch (IOException e) {

e.printStackTrace();

}

return null;

}

不過現在的網路http請求一般都會使用開源框架,文章開頭介紹的框架是現在比較流行的,大家可以使用,並且最好是能夠解刨裡面的實現原理,這對提高自己的能力有顯著的提升。

本人第一次寫技術文章,寫得不好的地方希望各個大神指出來,我會改進的。順便開通了公眾號,以後的文章也會更新到公眾號,還有一些生活和麵試之類的分享哦。



相關文章