HttpRequest

Android中通過HttpRequest與服務器端進行JSON格式數據交互

JSON(JavaScript Object Notation)定義

一種輕量級的數據交換格式,具有良好的可讀和便于快速編寫的特性。

JSON的結構

(1) Name/Value Pairs(無序的):類似所熟知的Keyed list,Hash table,Distionary和Associative array。在Android平臺中同時存在另外一個類"Bundle",某種程度上具有相似的行為。
(2)Array(有序的):一組有序的數據列表

對象

對象是一個無序的Name/Value Pairs集合。{name:value, name:value, ...}

Array

Array是值(value)的有序集合。[value, value, value ...]
值(value)可以是雙引號括起來的字符串(string)、數值(number)、true、false、null、對象(object)或者數組(array)。這些結構可以嵌套。
字符串(string)是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。 例如:/ + " / / b f n r t u 進行轉義。

例子1:

Array里面包含對象(object)[ {"id":1,"name":"小豬" ,"age”:22} , {"id":2,"name":"小貓","age”:23} , .......]

例子2:

同樣對象(object)中可以包含Array
(1)一個對象包含1個數組,2個子對象{"root":[{"id":"001","name":"小豬"},{"id":"002","name":"小貓"},{"id":"003","name":"小狗"}], "total":3, "success":true}

(2)也可以對象嵌套子對象,子對象再嵌套數組{"calendar": {"calendarlist": [ {"id":"001","name":"小豬"}, {"id":"002","name":"小貓"} ] } }

總之,格式多種多樣,可以互相嵌套

在Android中包含四個與JSON相關的類和一個Exceptions:

JSONArray
JSONObject
JSONStringer
JSONTokener
JSONException

(1) JSONObject

這是系統中有關JSON定義的基本單元,其包含一對(Key/Value)數值。
它對外部(External:應用toString()方法輸出的數值)調用的響應體現為一個標準的字符串

(2)JSONArray:
(3)JSONStringer
(4)JSONTokener
一個詳細的例子
public class JSON{

public static List getJSONArray(String path)throws Exception{

}
public static List getJSONObject(String path) throws Exception{

}
public static List getJSON(String path) throws Exception{

}
用HttpClient以Post方式提交數據并添加http頭信息
private void HttpPostData() {  
try
   {  
HttpClient httpclient = new DefaultHttpClient();  
String uri = "http://www.yourweb.com";  
HttpPost httppost = new HttpPost(uri);   
//添加http頭信息 

httppost.addHeader("Authorization", "your token"); //認證token 

httppost.addHeader("Content-Type", "application/json");  
httppost.addHeader("User-Agent", "imgfornote");  
//http post的json數據格式:  {"name": "your name","parentId": "id_of_parent"} 

JSONObject obj = new JSONObject();  
obj.put("name", "your name");  
obj.put("parentId", "your parentid");  
httppost.setEntity(new StringEntity(obj.toString()));     
HttpResponse response;  
response = httpclient.execute(httppost);  
//檢驗

Android-Async-Http:

快速Android開發系列網絡篇之Android-Async-Http


Android 中網絡操作使用總結

android中進行網絡連接一般是使用socket或者http,http是最多的情況。

android是采用java語言開發的,android中包含java的URLConnection和Apache的httpclient,因此我們可以使用這兩個工具進行網絡連接和操作。
同時,為了控制是否允許程序聯網,開發時,需要在Manifest文件中配置申請網絡連接的權限。

<uses-permission android:name = "android.permission.INTERNET"></uses-permission>
使用URLConnection連接網絡

URLConnection為java.net包中提供的網絡訪問,支持http,https,ftp等,進行http連接時,使用HttpURLConnection即可,示例代碼如下:

URL url = new URL("http://www.baidu.com");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try{
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in); //該方法為自定義方法,從流中讀取數據保存到本地,實現從網絡獲取數據。
finally{
urlConnection.disconnect();
}

HttpURLConnection

android http協議post請求方式

HttpURLConnection、URL(import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;)

URL url = new URL(<String>)
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();

//設置連接屬性
httpConn.setDoOutput(true);//使用URL連接進行輸出
httpConn.setDoInput(true);//使用URL連接進行輸入
httpConn.setUseCaches(false);//忽略緩存
httpConn.setRequestMethod("POST");//設置URL請求方法
String requestString = “客戶端要以流方式發送到服務端的數據”;

//設置請求屬性
//獲得數據字節數據,請求數據流的編碼,必須和下面服務器端處理請求流的編碼一致。
byte[] requestStringBytes = requestString.getBytes(ENCODING_UTF_8);
httpConn.setRequestProperty("Content-length",“”+requestStringBytes.length);


android之HttpURLConnection

  1. HttpURLConnection連接URL
    創建URL對象
    URL url = new URL(http://baidu.com);
    利用HttpURLConnection對象從網絡獲取網頁數據
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    設置連接超時
    conn.setConnectTimeout(6*1000);
    對響應碼進行判斷
    if (conn.getResponseCode() != 200) //從Internet獲取網頁,發送請求,將網頁以流的形式讀回來
    throw new RuntimeException("請求url失敗");
    得到網絡返回的輸入流
    InputStream is = conn.getInputStream();
    String result = readData(is, "GBK"); //文件流輸入出文件用outStream.write
    conn.disconnect();

總結--
記得設置連接超時,如果網絡不好,Android系統在超過默認時間會收回資源中斷操作.
返回的響應碼200,是成功.
在Android中對文件流的操作和JAVA SE上面是一樣的.
在對大文件的操作時,要將文件寫到SDCard上面,不要直接寫到手機內存上.
操作大文件是,要一邊從網絡上讀,一邊要往SDCard上面寫,減少手機內存的使用.這點很重要,面試經常會被問到.
對文件流操作完,要記得及時關閉.

  1. 向Internet發送請求參數
    步驟:
    創建URL對象
    通過HttpURLConnection對象,向網絡地址發送請求
    設置容許輸出:
    conn.setDoOutput(true);
    設置不使用緩存:
    conn.setUseCache(false);
    設置使用POST方式發送:
    conn.setRequestMethod("POST");
    設置維持長連接:
    conn.setRequestProperty("Connection","Keep-Alive");
    設置文件字符集:
    conn.setRequestProperty("Charset","UTF-8");
    設置文件長度
    conn.setRequestProperty("Content-Length",String.valueOf(data.length));
    設置文件類型:
    conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

總結
發送POST請求必須設置允許輸出
不要使用緩存,容易出現問題.
在開始用HttpURLConnection對象的setRequestProperty()設置,就是生成HTML文件頭.

  1. 向Internet發送xml數據

11)設置文件類型:conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
12)以文件流的方式發送xml數據:outStream.write(xmlbyte);
總結:
--我們使用的是用HTML的方式傳輸文件,這個方式只能傳輸一般在5M一下的文件.
--傳輸大文件不適合用HTML的方式,傳輸大文件我們要面向Socket編程.確保程序的穩定性
--將地址和參數存到byte數組中:byte[] data = params.toString().getBytes();


Http學習之使用HttpURLConnection發送post和get請求 android

最常用的Http請求無非是get和post,get請求可以獲取靜態頁面,也可以把參數放在URL字串后面,傳遞給servlet,post與get的不同之處在于post的參數不是放在URL字串里面,而是放在http請求的正文內。在Java中可以使用HttpURLConnection發起這兩種請求

HttpURLConnection.connect函數,實際上只是建立了一個與服務器的tcp連接,并沒有實際發送http請求。無論是post還是get,http請求實際上直到HttpURLConnection.getInputStream()這個函數里面才正式發送出去。對connection對象的一切配置(那一堆set函數)都必須在connect()函數執行之前完成。而對OutputStream的寫操作,又必須在inputStream的讀操作之前。這些順序實際上是由http請求的格式決定的。

http請求實際上由兩部分組成,一個是http頭,所有關于此次http請求的配置都在http頭里面定義,一個是正文content,在connect()函數里面,會根據HttpURLConnection對象的配置值生成http頭,因此在調用connect函數之前,就必須把所有的配置準備好。

緊接著http頭的是http請求的正文,正文的內容通過outputStream寫入,實際上outputStream不是一個網絡流,充其量是個字符串流,往里面寫入的東西不會立即發送到網絡,而是在流關閉后,根據輸入的內容生成http正文

至此,http請求的東西已經準備就緒。在getInputStream()函數調用的時候,就會把準備好的http請求正式發送到服務器了,然后返回一個輸入流,用于讀取服務器對于此次http請求的返回信息。由于http請求在getInputStream的時候已經發送出去了(包括http頭和正文),因此在getInputStream()函數之后對connection對象進行設置(對http頭的信息進行修改)或者寫入outputStream(對正文進行修改)都是沒有意義的了,執行這些操作會導致異常的發生。


HttpClient、HttpGet、HttpResponse、HttpPost

Android Http操作介紹
無論是使用HttpGet,還是使用HttpPost,都必須通過如下3步來訪問HTTP資源。
1.創建HttpGet或HttpPost對象,將要請求的URL通過構造方法傳入HttpGet或HttpPost對象。
2.使用DefaultHttpClient類的execute方法發送HTTP GET或HTTP POST請求,并返回HttpResponse對象。
3.通過HttpResponse接口的getEntity方法返回響應信息,并進行相應的處理。
如果使用HttpPost方法提交HTTP POST請求,還需要使用HttpPost類的setEntity方法設置請求參數。

注意,在用Post時,傳遞變量必須用NameValuePais[]數組存儲,通過HttpRequest.setEntity()方法來發出http請求。
此外,也必須通過DefaultHttpClient().execute(httpRequest)添加HttpRequest對象來接收web server的回復,再通過httpResponse.getEntity()取出回復信息。

Android HTTP實例 使用GET方法和POST方法發送請求

//使用Get方法發送請求,需要把參數加載URL后面,用?連接,參數之間用&分隔
String url = baseURL+"?username"+name+"&age"+age;

//生成請求對象
HttpGet httpGet = new HttpGet(url);
HttpClient httpClient = new DefaultHttpClient();

//發送請求
try{
HttpResponse response = httpClient.execute(httpGet);
//自定義函數顯示響應
showResponseResult(response);
}catch(Exception e)
{
e.printStackTrace();
}

post方式

NameValuePair pair1 = new BasicNameValuePair("username",name);
NameValuePair pair2 = new BasicNameValuePair("age",age);

List<NameValuePair> pairList = new ArrayList<NameValuePair>();
pairList.add(pair1);
pairList.add(pair2);

try{
HttpEntity requestHttpEntity = new UrlEncodeFormEntity(pairList);
//URL使用基本URL即可,其中不需要加參數
HttpPost httpPost = new HttpPost(baseURL);
//將請求體內容加入請求中
httpPost.setEntity(requestHttpEntity);
//需要客戶端對象來發送請求
HttpClient httpClient = new DefaultHttpClient();
//發送請求
HttpResponse response =     httpClient.execute(httpPost);
//自定義函數顯示響應
showResponseResult(response);
}catch(Exception e)
{
e.printStackTrace();
}

自定義處理函數

private void showResponseResult(HttpResponse response)
{
if (null ==response)
{
return;
}
HttpEntity httpEntity = response.getEntity();
try{
InputStream inputStream =     httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String result="";
String line = "";
while(null!=(line = reader.readLine()))
{
result +=line;
}
System.out.println(result);
}catch(Exception e)
{
e.printStackTrace();
}
}

參考:

HttpURLConnection:

  1. Http學習之使用HttpURLConnection發送post和get請求 android
    講述了一些原理,提供了例子代碼
  2. Android HttpURLConnection 基礎使用
    給了簡單的例子

HttpClient:

  1. Android HTTP實例 使用GET方法和POST方法發送請求
  2. android http協議post請求方式
  3. Android Http操作介紹
  4. Android 中通過HTTPRequest 與服務端進行 JSON格式數據交互

JSON:

  1. Android 中通過HTTPRequest 與服務端進行 JSON格式數據交互

Android-Async-Http:

  1. 快速Android開發系列網絡篇之Android-Async-Http
  2. android http請求異步封裝
    android http多請求異步封裝對你絕對有用
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容