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中進行網絡連接一般是使用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
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);
- 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上面寫,減少手機內存的使用.這點很重要,面試經常會被問到.
對文件流操作完,要記得及時關閉.
- 向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文件頭.
- 向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:
-
Http學習之使用HttpURLConnection發送post和get請求 android
講述了一些原理,提供了例子代碼 -
Android HttpURLConnection 基礎使用
給了簡單的例子
HttpClient:
- Android HTTP實例 使用GET方法和POST方法發送請求
- android http協議post請求方式
- Android Http操作介紹
- Android 中通過HTTPRequest 與服務端進行 JSON格式數據交互
JSON:
Android-Async-Http:
- 快速Android開發系列網絡篇之Android-Async-Http
-
android http請求異步封裝
android http多請求異步封裝對你絕對有用