网络访问基础篇(适合新手)
2015-08-10 16:23
495 查看
网络解析基础篇:
网络解析百分之八十多是用的Json作为数据格式,也有个别使用xml,那么今天就用json来做网络交互,我们自己手工去解json的话会很繁琐,那么我们一般会借助反射机制,来反射Bean中的属性,吧json属性的key跟属性名equals就行。没错,,有人会知道,这就是google的Gson包所做的事情,那么我们就借助Gson来做个简易的网络交互。
这里,我就不写反射代码了,直接下载Gson,使用Gson现成提供的方法来实现:
为大家找了一个0分下载的Gson 2.3.1 :http://download.csdn.net/detail/zxyyxzzxy004/8206489
这里以get方法为例:
handleGetUrl方法:
我来解释下:
先看一段Json:
{
"state":"200",
"msg":"成功",
"time":"2015-8-4 15:59",
"result":{
token:"347f296f3f0f4f1753c6cea42c5ecc70", //key
id:"11", //id
username:"18910416762", //账号
nickname:"张三", //昵称
headimg:"1.jpg", //头像
mobile:"13456543423", //手机号
password:"347f296f3f0f4f1753c6cea42c5ecc70" //密码
}
}
4个参数,
说明下,如果服务器没有返回对应的值,那么将对应的key将是默认赋给null,
如果发现爆Google。xxx。xxx或者Gson.xxx.xxx等Exception,不要着急,耐心的慢慢排查你的bean,
八成是bean的结构不规范。照着上面的例子,调整下结构就行,,
Post方法同理,只要获取到Json,剩下部分完全可以原样copy!
大神勿喷!纯属简单介绍一个简单的网络交互!
网络解析百分之八十多是用的Json作为数据格式,也有个别使用xml,那么今天就用json来做网络交互,我们自己手工去解json的话会很繁琐,那么我们一般会借助反射机制,来反射Bean中的属性,吧json属性的key跟属性名equals就行。没错,,有人会知道,这就是google的Gson包所做的事情,那么我们就借助Gson来做个简易的网络交互。
这里,我就不写反射代码了,直接下载Gson,使用Gson现成提供的方法来实现:
为大家找了一个0分下载的Gson 2.3.1 :http://download.csdn.net/detail/zxyyxzzxy004/8206489
这里以get方法为例:
public class NetConnector { public static final int SUCCESS = 0; public static final int ERROR = -1; private static HttpClient client = new DefaultHttpClient(); private static AsyncHttpClient asyncClient = new AsyncHttpClient(); public static void doGet(String url, HashMap<String,String> params,Class<?> clazz, Handler handler) { Message msg = Message.obtain(); String currUrl = handleGetUrl(url, params); try { HttpGet get = new HttpGet(currUrl); HttpResponse responce = client.execute(get); if (responce.getStatusLine().getStatusCode() == 200) { String jsonStr = EntityUtils.toString(responce.getEntity(), "UTF-8"); Gson gson = new Gson(); TypeToken<?> token = TypeToken.get(clazz); msg.obj = gson.fromJson(jsonStr, token.getType()); msg.what = SUCCESS; handler.sendMessage(msg); } else { msg.what = ERROR; msg.obj = "获取服务器数据失败,请稍后重试!"; handler.sendMessage(msg); } } catch (ClientProtocolException e) { e.printStackTrace(); msg.what = ERROR; msg.obj = "访问服务器失败!"; handler.sendMessage(msg); } catch (SocketTimeoutException e) { e.printStackTrace(); msg.what = ERROR; msg.obj = "连接服务器超时!"; handler.sendMessage(msg); } catch (ConnectTimeoutException e) { e.printStackTrace(); msg.what = ERROR; msg.obj = "连接服务器超时!"; handler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); msg.what = ERROR; msg.obj = "数据获取失败!"; handler.sendMessage(msg); } } }
handleGetUrl方法:
private static String handleGetUrl(String url,HashMap<String,String> params){ StringBuffer sBuffer = new StringBuffer(url); if(!url.endsWith("?")) sBuffer.append("?"); int i = 0; for (String key : params.keySet()) { String value = params.get(key); sBuffer.append(key+"="+value); if(!(i==params.size()-1)) sBuffer.append("&"); i++; } return sBuffer.toString(); }
我来解释下:
先看一段Json:
{
"state":"200",
"msg":"成功",
"time":"2015-8-4 15:59",
"result":{
token:"347f296f3f0f4f1753c6cea42c5ecc70", //key
id:"11", //id
username:"18910416762", //账号
nickname:"张三", //昵称
headimg:"1.jpg", //头像
mobile:"13456543423", //手机号
password:"347f296f3f0f4f1753c6cea42c5ecc70" //密码
}
}
4个参数,
String url,//接口地址 HashMap<String,String> params//参数列表 ,Class<?> clazz,//将要回递给你的Bean对象,这是核心,Gson将反射它。来解析Json中的数据,然后一一对应进行赋值,这里重点解释这个。。Gson有个规范 // 如果想通过Gson解析,那么必须按照它的规范来,那么我来简单解释下这个规范,例如: /* package com.angelonline.obj; import java.io.Serializable; public class LoginObj implements Serializable{ private static final long serialVersionUID = 5018899594211061547L; private String token = "";//:"347f296f3f0f4f1753c6cea42c5ecc70", //key private String id = "";//:"11", //id private String username = "";//:"18910416762", //账号 private String nickname = "";//:"张三", //昵称 private String headimg = "";//:"1.jpg", //头像 private String mobile = "";//:"13456543423", //手机号 private String password = "";//:"347f296f3f0f4f1753c6cea42c5ecc70" //密码 public LoginObj(){} public LoginObj(String token,String id,String username,String nickname,String headimg,String mobile,String password){ this.token = token; this.id = id; this.username = username; this.nickname = nickname; this.headimg = headimg; this.mobile = mobile; this.password = password; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getHeadimg() { return headimg; } public void setHeadimg(String headimg) { this.headimg = headimg; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } */ Handler handler//回调解释的有点笼统,具体了解请见Gson解析,去google官方或者百度更多demo。
说明下,如果服务器没有返回对应的值,那么将对应的key将是默认赋给null,
如果发现爆Google。xxx。xxx或者Gson.xxx.xxx等Exception,不要着急,耐心的慢慢排查你的bean,
八成是bean的结构不规范。照着上面的例子,调整下结构就行,,
Post方法同理,只要获取到Json,剩下部分完全可以原样copy!
大神勿喷!纯属简单介绍一个简单的网络交互!
相关文章推荐
- Android 异步加载数据 AsyncTask+Handler+AsyncHttpClient+Universal_Image_loader+Volley
- HTTP深入浅出 http请求
- WCF使用小结:(1)WCF接收HTTP POST数据的处理方法
- 流媒体方便快捷应用于校园生活
- Android中加载网络资源时的优化可使用(线程+缓存)解决
- TCP echo demo
- [谷歌地图--探索世界]https://geoguessr.com/
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
- 正则表达式查找CRLF注入攻击漏洞(HTTP响应拆分漏洞)
- post NSURLConnection请求网络数据
- Codeforces Round #284 (Div. 1) C. Array and Operations(网络流‘最大流)
- windows的socket_tcp服务端与windows的socket_tcp客服端简单通讯
- NSURLConnection 异步加载网络数据
- tcp状态
- CRLF注入详解 (HTTP响应头拆分)学习笔记(一)
- Git https方式记住用户名密码
- awk http://my.oschina.net/denglz/blog/151310?p=1
- 打造安全的App!iOS安全系列之 HTTPS
- AE开发资料整理,源自网络!
- hunnu OJ 11567 Escaping(拆点型最大匹配/网络流)