Android App開發基礎篇—HttpURLConnection基礎使用
前言:網絡請求功能是許多軟體開發中必備的功能之一。在Android開發中,實作網絡請求有許多方法,除了可以使用API文檔提供的HttpURLconnection類,還有網絡上各種各樣的開源架構,比如現今比較流行的Volley,OKHttp,Retrofit等。本篇文章起,我們将會一一認識一下當下Android開發中幾種比較流行的網絡請求方法的基本使用。首先,本篇文章先來認識最基本的HttpURLConenction。
一、基本使用步驟:
要使用HttpURLConnection進行基本的網絡請求,隻需遵循以下幾個步驟:
(1)擷取URL執行個體:使用請求網址(或伺服器接口位址)擷取一個URL執行個體。 例如:
//建立URL資源
URL url = new URL("http://www.baidu.com");
(2)建立HTTP連接配接,擷取HttpURLConnection執行個體:通過URL執行個體的openConnection()方法建立連結,同時将該方法傳回的一個執行個體強轉為HttpURLConnection類型。
//建立HTTP連接配接,擷取HttpURLConnection執行個體
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
(3)設定HTTP請求的方式(可選):通過HttpURLConnection執行個體的setRequestMethod()方法,設定HTTP請求的方式,其中可選方式包括GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE,常用的為GET和POST。預設為GET。例如:
//設定請求方式
conn.setRequestMethod("POST");
(4)設定連接配接屬性,添加請求參數(可選):使用HttpURLConnection執行個體的addRequestProperty()方法可以為HTTP連接配接設定一些連接配接屬性,例如,設定HTTP連接配接的header資訊,或者在HTTP連接配接中添加服務端所要求的請求參數等。下面列舉一些常見屬性,在實際應用中按需而定:
//設定維持長連接配接
conn.addRequestProperty("Connection", "Keep-Alive");
//設定檔案字元集格式為UTF-8
conn.addRequestProperty("Charset", "UTF-8");
//設定檔案類型為JSON格式
conn.addRequestProperty("Content-Type", "application/json");
//添加服務端接口所需請求參數,例如登入接口所需的使用者名
conn.addRequestProperty("username","test");
(5)設定是否允許輸出(可選):如果HTTP請求中需要包含請求參數,如登入接口需要使用者名和密碼參數,則需要使用HttpURLConnection執行個體設定setDoOutput(true)(預設為false)。同時,如果将該方法設定為true,即使沒有在代碼中設定setRequestMethod("POST"),HTTP請求也會自動使用POST方式。
//設定允許輸出
conn.setDoOutput(true);
(6)設定是否需要緩存(可選)
//設定不用緩存
conn.setUseCaches(false);
(7)擷取請求結果:
//請求結果碼
int responseCode = conn.getResponseCode();
//responseCode==200表示請求成功
if (responseCode == 200) {
//擷取傳回的資料
InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1)
{
baos.write(buffer, 0, len);
}
String str = baos.toString();
baos.flush();
baos.close();
is.close();
}
(8)斷開連接配接
conn.disconnect();
二、向服務端送出JSON,傳回JSON資料
這裡以一個使用者登入接口為例,接口需要2個參數:使用者名username和密碼password,參數需以JSON格式送出,服務端傳回的資料也是JSON格式。
/* * 本方法示範通過HttpURLConnection向 * 服務端送出JSON,并從服務端傳回JSON資料 * 其中被注釋的代碼表示可選設定,實際開發中 * 依據需求而設定 * * */
private void loginRequest() {
try {
//建構JSON執行個體并向其中添加請求參數
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", "test");
jsonObject.put("password", "test");
//建立URL資源
URL url = new URL(LOGIN);
//建立HTTP連接配接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//設定允許輸出
conn.setDoOutput(true);
//預設即為true,如果設定成false,
//将無法收到服務端傳回的資料
// conn.setDoInput(true);
//設定不用緩存
// conn.setUseCaches(false);
//設定請求方式
// conn.setRequestMethod("POST");
//設定維持長連接配接
// conn.addRequestProperty("Connection", "Keep-Alive");
//設定檔案字元集格式
// conn.addRequestProperty("Charset", "UTF-8");
//設定檔案類型
// conn.addRequestProperty("Content-Type", "application/json");
//JSON轉為位元組數組
byte[] bytesData = jsonObject.toString().getBytes();
//設定檔案長度
// conn.addRequestProperty("Content-Length", String.valueOf(bytesData.length));
//開始請求
conn.connect();
OutputStream outputStream = conn.getOutputStream();
//寫入請求的資料
outputStream.write(bytesData);
outputStream.flush();
outputStream.close();
//請求結果碼
int responseCode = conn.getResponseCode();
Log.e("MainActivity", "responseCode:" + responseCode);
if (responseCode == 200) {
InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String str = baos.toString();
Log.e("MainActivity", str);
//對服務端傳回的JSON格式的資料進行解析
JSONObject json = new JSONObject(str);
String msg = json.optString("msg");
Log.e("MainActivity", msg);
baos.flush();
baos.close();
is.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}