我的笔记——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便可访问被保护页面了。

相关文章
相关标签/搜索