我的筆記——Android網絡技術

1、WebView 的用法java

Android 提供WebView 的用法,能夠在本身的應用程序裏嵌入一個瀏覽器node

 

[java]  view plain copy
 
  1. webView.getSettings().setJavaScriptEnabled(true);  
  2.         webView.setWebViewClient(new WebViewClient() {  
  3.   
  4.   
  5.             @Override  
  6.             public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  7.                 view.loadUrl(url); // 根據傳入的參數再去加載新的網頁  
  8.                 return true; // 表示當前WebView能夠處理打開新網頁的請求,不用藉助系統瀏覽器  
  9.             }  
  10.   
  11.   
  12.         });  
  13.         webView.loadUrl("http://www.baidu.com");  


聲明權限android

 

<uses-permission android:name="android.permission.INTERNET" />web

2、 HTTP 協議訪問網絡json

(1)使用 HttpURLConnection數組

獲取到 HttpURLConnection 的實例瀏覽器

 

[java]  view plain copy
 
  1. URL url = new URL("http://www.baidu.com");  
  2. HttpURLConnection connection = (HttpURLConnection) url.openConnection();  

設置一下 HTTP 請求所使用的方法緩存

 

connection.setRequestMethod("GET");服務器

置鏈接超時、讀取超時的毫秒數網絡

 

[java]  view plain copy
 
  1. connection.setConnectTimeout(8000);  
  2. connection.setReadTimeout(8000);  

InputStream in = connection.getInputStream();

[java]  view plain copy
 
  1. InputStream in = connection.getInputStream();  


最後能夠調用 disconnect()方法將這個 HTTP 鏈接關閉掉

[java]  view plain copy
 
  1. connection.disconnect();  


POST方法能夠這樣寫

 

 

[java]  view plain copy
 
  1. connection.setRequestMethod("POST");  
  2. DataOutputStream out = new DataOutputStream(connection.getOutputStream());  
  3. out.writeBytes("username=admin&password=123456");  

 

 

(2) HttpClient

HttpClient 是一個接口,所以沒法建立它的實例,一般狀況下都會建立一個 DefaultHttpClient 的實例

 

[java]  view plain copy
 
  1. HttpClient httpClient = new DefaultHttpClient();  


建立一個 HttpGet 對象,並傳入目標的網絡地址,而後調用 HttpClient 的 execute()方法

 

 

[java]  view plain copy
 
  1. HttpGet httpGet = new HttpGet("http://www.baidu.com");  
  2. httpClient.execute(httpGet);  

發起POST請求

 

 

[java]  view plain copy
 
  1. HttpPost httpPost = new HttpPost("http://www.baidu.com");  


經過一個 NameValuePair 集合來存放待提交的參數,並將這個參數集合傳入到一個UrlEncodedFormEntity中,

 

而後調用 HttpPost的 setEntity()方法將構建好的 UrlEncodedFormEntity傳入

[java]  view plain copy
 
  1. List<NameValuePair> params = new ArrayList<NameValuePair>();  
  2. params.add(new BasicNameValuePair("username", "admin"));  
  3. params.add(new BasicNameValuePair("password", "123456"));  
  4. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");  
  5. httpPost.setEntity(entity);  
  6. httpClient.execute(httpPost);  

執行 execute()方法以後會返回一個 HttpResponse對象, 服務器所返回的全部信息就會包含在這裏面

[java]  view plain copy
 
  1. if (httpResponse.getStatusLine().getStatusCode() == 200) {  
  2. // 請求和響應都成功了  
  3. }  

 if 判斷的內部取出服務返回的具體內容,能夠調用 getEntity()方法獲取到一個 HttpEntity 實例,

 

而後再用 EntityUtils.toString()這個靜態方法將 HttpEntity 轉換成字符串

[java]  view plain copy
 
  1. HttpEntity entity = httpResponse.getEntity();  
  2. String response = EntityUtils.toString(entity, "utf-8");  

3、解析XML

 

(1)Pull解析

 

[java]  view plain copy
 
  1. protected void parseXMLWithPull(String response) {  
  2.         // TODO Auto-generated method stub  
  3.         try {  
  4.             XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
  5.             XmlPullParser xmlPullParser = factory.newPullParser();  
  6.             xmlPullParser.setInput(new StringReader(response));  
  7.             int eventType = xmlPullParser.getEventType();  
  8.             String id = "";  
  9.             String name = "";  
  10.             String version = "";  
  11. //開始某個節點的解析  
  12. while (eventType != XmlPullParser.END_DOCUMENT) {  
  13.                 String nodeName = xmlPullParser.getName();  
  14.                 switch (eventType) {  
  15.                 case XmlPullParser.START_TAG: {  
  16.                     if ("id".equals(nodeName)) {  
  17.                         id = xmlPullParser.nextText();  
  18.                     } else if ("name".equals(nodeName)) {  
  19.                         name = xmlPullParser.nextText();  
  20.                     } else if ("version".equals(nodeName)) {  
  21.                         version = xmlPullParser.nextText();  
  22.                     }  
  23.                     break;  
  24.                 }  
[java]  view plain copy
 
  1. //完成某個節點的解析  
  2.             case XmlPullParser.END_TAG: {  
  3.                 if ("app".equals(nodeName)) {  
  4.                     Log.d("MainActivity", "id is " + id);  
  5.                     Log.d("MainActivity", "name is " + name);  
  6.                     Log.d("MainActivity", "version is " + version);  
  7.                 }  
  8.                 break;  
  9.             }  
  10.             default:  
  11.                 break;  
  12.             }  
  13.             eventType = xmlPullParser.next();  
  14.         }  
  15.   
  16.     } catch (Exception e) {  
  17.         // TODO Auto-generated catch block  
  18.         e.printStackTrace();  
  19.     }  
  20. }  

 

 

 

(2)SAX解析

新建一個類繼承自 DefaultHandler,並重寫父類的五個方法

[java]  view plain copy
 
  1. public class ContentHandler extends DefaultHandler {  
  2.     private String nodeName;  
  3.     private StringBuilder id;  
  4.     private StringBuilder name;  
  5.     private StringBuilder version;  
  6.   
  7.     @Override  
  8.     public void startDocument() throws SAXException {  
  9.         // TODO Auto-generated method stub  
  10.         id = new StringBuilder();  
  11.         name = new StringBuilder();  
  12.         version = new StringBuilder();  
  13.     }  
  14.   
  15.     @Override  
  16.     public void endDocument() throws SAXException {  
  17.         // TODO Auto-generated method stub  
  18.   
  19.     }  
  20.   
  21.     @Override  
  22.     public void startElement(String uri, String localName, String qName,  
  23.             Attributes attributes) throws SAXException {  
  24.         // TODO Auto-generated method stub  
  25.         nodeName = localName;  
  26.     }  
  27.   
  28.     @Override  
  29.     public void endElement(String uri, String localName, String qName)  
  30.             throws SAXException {  
  31.         // TODO Auto-generated method stub  
  32.         if ("app".equals(localName)) {  
  33.             Log.d("ContentHandler", "id is " + id.toString().trim());  
  34.             Log.d("ContentHandler", "name is " + name.toString().trim());  
  35.             Log.d("ContentHandler", "version is " + version.toString().trim());  
  36.             // 最後要將StringBuilder清空掉  
  37.             id.setLength(0);  
  38.             name.setLength(0);  
  39.             version.setLength(0);  
  40.         }  
  41.     }  
  42.   
  43.     @Override  
  44.     public void characters(char[] ch, int start, int length)  
  45.             throws SAXException {  
  46.         // TODO Auto-generated method stub  
  47.         if ("id".equals(nodeName)) {  
  48.             id.append(ch, start, length);  
  49.         } else if ("name".equals(nodeName)) {  
  50.             name.append(ch, start, length);  
  51.         } else if ("version".equals(nodeName)) {  
  52.             version.append(ch, start, length);  
  53.         }  
  54.     }  
  55.   
  56. }  

調用進行解析

 

 

[java]  view plain copy
 
  1. SAXParserFactory factory = SAXParserFactory.newInstance();  
  2. XMLReader xmlReader = factory.newSAXParser().getXMLReader();  
  3. ContentHandler handler = new ContentHandler();  
  4. //  將ContentHandler 的實例設置到XMLReader 中  
  5. xmlReader.setContentHandler(handler);  
  6. //  開始執行解析  
  7. xmlReader.parse(new InputSource(new StringReader(xmlData)));  


4、解析 JSON 格式數據

 

JSON 的主要優點在於它的體積更小,在網絡上傳輸的時
候能夠更省流量

(1)數據格式

[{"id":"5","version":"5.5","name":"Angry Birds"},
{"id":"6","version":"7.0","name":"Clash of Clans"},
{"id":"7","version":"3.5","name":"Hey Day"}]
(2)使用使用 JSONObject解析

 

[java]  view plain copy
 
  1. protected void parseJSONWithJSONObject(String response) {  
  2.         try {  
  3. //將服務器返回的數據傳入到了一個 JSONArray 對象中  
  4.             JSONArray jsonArray = new JSONArray(response);  
  5.             for (int i = 0; i < jsonArray.length(); i++) {  
  6. //循環遍歷這個 JSONArray, 從中取出的每個元素都是一個 JSONObject 對象  
  7.                 JSONObject jsonObject = jsonArray.getJSONObject(i);  
  8.                 String id = jsonObject.getString("id");//將這些數據取出  
  9.                 String name = jsonObject.getString("name");  
  10.                 String version = jsonObject.getString("version");  
  11.                 Log.d("MainActivity", "id is " + id);  
  12.                 Log.d("MainActivity", "name is " + name);  
  13.                 Log.d("MainActivity", "version is " + version);  
  14.             }  
  15.         } catch (Exception e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  

(3)使用 GSON

 

添加一個 GSON的 Jar包

首先新建與數據相對應的類,實現其getter和setter方法

解析代碼

 

[java]  view plain copy
 
  1. Gson gson = new Gson();  
  2. List<App> appList = gson.fromJson(jsonData, newTypeToken<List<App>>() {}.getType());  
  3. //因爲是數組,藉助 TypeToken 將指望解析成的數據類型傳入到 fromJson()方法中  
  4. for (App app : appList) {  
  5. Log.d("MainActivity", "id is " + app.getId());  
  6. Log.d("MainActivity", "name is " + app.getName());  
  7. Log.d("MainActivity", "version is " + app.getVersion());  
  8. }  

5、HttpURLConnection和HttpClient的區別(轉載自:百度知道)

Volley框架中在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及如下版本,使用的是HttpClient。Android中主要提供了兩種方式來進行HTTP操做,HttpURLConnection和HttpClient。這兩種方式都支持HTTPS協議、以流的形式進行上傳和下載、配置超時時間、IPv六、以及鏈接池等功能。

HttpClient:DefaultHttpClient和AndroidHttpClient都是HttpClient具體的實現類,它們都擁有衆多的API,並且實現比較穩定,bug數量也不多。但同時也因爲HttpClient的API數量過多,使得咱們很難在不破壞兼容性的狀況下對它進行升級和擴展HttpURLConnection:HttpURLConnection是一種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操做能夠適用於大多數的應用程序。雖然HttpURLConnection的API提供的比較簡單,可是同時這也使得咱們能夠更加容易地去使用和擴展它。不過在Android 2.2版本以前,HttpURLConnection一直存在着一些使人厭煩的bug。      而在Android 2.3版本及之後,HttpURLConnection則是最佳的選擇。它的API簡單,體積較小,於是很是適用於Android項目。壓縮和緩存機制能夠有效地減小網絡訪問的流量,在提高速度和省電方面也起到了較大的做用。對於新的應用程序應該更加偏向於使用HttpURLConnection,由於在之後的工做當中咱們也會將更多的時間放在優化HttpURLConnection上面。        HttpURLConnection是java的標準類,HttpURLConnection繼承自URLConnection,可用於向指定網站發送GET請求、POST請求。它在URLConnection的基礎上提供了以下便捷的方法:int getResponseCode():獲取服務器的響應代碼。String getResponseMessage():獲取服務器的響應消息。String getResponseMethod():獲取發送請求的方法。void setRequestMethod(String method):設置發送請求的方法。       在通常狀況下,若是隻是須要Web站點的某個簡單頁面提交請求並獲取服務器響應,HttpURLConnection徹底能夠勝任。但在絕大部分狀況下,Web站點的網頁可能沒這麼簡單,這些頁面並非經過一個簡單的URL就可訪問的,可能須要用戶登陸並且具備相應的權限纔可訪問該頁面。在這種狀況下,就須要涉及Session、Cookie的處理了,若是打算使用HttpURLConnection來處理這些細節,固然也是可能實現的,只是處理起來難度就大了。       爲了更好地處理向Web站點請求,包括處理Session、Cookie等細節問題,Apache開源組織提供了一個HttpClient項目,看它的名稱就知道,它是一個簡單的HTTP客戶端(並非瀏覽器),能夠用於發送HTTP請求,接收HTTP響應。但不會緩存服務器的響應,不能執行HTML頁面中嵌入的Javascript代碼;也不會對頁面內容進行任何解析、處理。       簡單來講,HttpClient就是一個加強版的HttpURLConnection,HttpURLConnection能夠作的事情HttpClient所有能夠作;HttpURLConnection沒有提供的有些功能,HttpClient也提供了,但它只是關注於如何發送請求、接收響應,以及管理HTTP鏈接。       使用HttpClient發送請求、接收響應很簡單,只要以下幾步便可。(1)建立HttpClient對象。(2)若是須要發送GET請求,建立HttpGet對象;若是須要發送POST請求,建立HttpPost對象。(3)若是須要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用 setEntity(HttpEntity entity)方法來設置請求參數。(4)調用HttpClient對象的execute(HttpUriRequest request)發送請求,執行該方法返回一個HttpResponse。(5)調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包 裝了服務器的響應內容。程序可經過該對象獲取服務器的響應內容。       另外,Android已經成功地集成了HttpClient,這意味着開發人員能夠直接在Android應用中使用Httpclient來訪問提交請求、接收響應。好比一個Android應用須要向指定頁面發送請求,但該頁面並非一個簡單的頁面,只有當用戶已經登陸,並且登陸用戶的用戶名有效時纔可訪問該頁面。若是使用HttpURLConnection來訪問這個被保護的頁面,那麼須要處理的細節就太複雜了。       其實訪問Web應用中被保護的頁面,使用瀏覽器則十分簡單,用戶經過系統提供的登陸頁面登陸系統,瀏覽器會負責維護與服務器之間的Sesion,若是用戶登陸的用戶名、密碼符合要求,就能夠訪問被保護資源了。       在Android應用程序中,則可以使用HttpClient來登陸系統,只要應用程序使用同一個HttpClient發送請求,HttpClient會自動維護與服務器之間的Session狀態,也就是說程序第一次使用HttpClient登陸系統後,接下來使用HttpClient便可訪問被保護頁面了。

相關文章
相關標籤/搜索