2013年末,剛剛開始學android開發的時候,都是使用HttpURLConnection和HttpClient來進行網路訪問的,現在網上一搜尋開源的網路訪問框架一大堆,比如OkHttp、Volley、Retrofit、rxjava等等。那麼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請求一般都會使用開源框架,文章開頭介紹的框架是現在比較流行的,大家可以使用,並且最好是能夠解刨裡面的實現原理,這對提高自己的能力有顯著的提升。
本人第一次寫技術文章,寫得不好的地方希望各個大神指出來,我會改進的。順便開通了公眾號,以後的文章也會更新到公眾號,還有一些生活和麵試之類的分享哦。