天天看點

Android App開發基礎篇—HttpURLConnection基礎使用

作者:書生聽雨景闌珊林

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();

}

}

繼續閱讀