个人觉得网络数据交互对于任何技术来说都是最好玩的部分,不管是web前端还是Android,因为我觉得当一个应用程序具有和互联网上的资源交互的功能时才真正可以开始做些好玩的事。
而利用http传递Json数据无疑是网络数据交互里最简单,最便捷的方式。
由于正在学习Node.js和Android,这里就先介绍Android和Node.js的Express框架编写的后台之间利用http传递Json数据进行数据交互。
Android里怎样利用Http发送数据
Android里发送Http请求的方式有HttpUrlConnection和HttpClient两种。
HttpUrlConnection在java.net包下,是java原生支持的类,而HttpClient是apache提供的第三方类库,是对HttpUrlConnection的进一步封装,由于性能等原因,Google已不推荐在Android中使用。
这里就用原生的HttpUrlConnection实现一个简单的Http请求:
首先基于HttpUrlConnection实现一个Http工具类,该类实现了通过Http的Get和Post方式获取和发送Json数据的方法:
(注意:这里的HttpCallbackListener是一个自定义的用来将请求成功/失败的回调控制权转移的接口)
//首先基于HttpUrlConnection实现一个Http工具类,该类实现了通过Http的Get和Post方式获取和发送Json数据的方法
public class HttpUtil {
public static void sendGetHttpRequest(final String address, final HttpCallbackListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
URL url = null;
try {
url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer response = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
if (listener != null) {
listener.onFinish(response.toString());
}
} catch (Exception e) {
listener.onError(e);
}
}
}).start();
}
public static void sendPostHttpRequest(final String address,final String jsonBody,final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection=null;
URL url=null;
try {
url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setRequestProperty("Content-Type","application/json");
OutputStream outputStream=connection.getOutputStream();
BufferedWriter requestBody=new BufferedWriter(new OutputStreamWriter(outputStream));
requestBody.write(jsonBody);
requestBody.flush();
requestBody.close();
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer response = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
if (listener != null) {
listener.onFinish(response.toString());
}
} catch (Exception e) {
listener.onError(e);
}
}
}).start();
}
}
接下来再Activity中调用刚才的HttpUtil实现数据交互:
(注意:这里的Gson是一个Google提供的Json和java对象之间相互转化的工具)
List<Man> manList=new ArrayList<Man>();
Man man=new Man();
man.setName("post");
man.setAge(20);
manList.add(man);
manList.add(man);
Gson gson=new Gson();
String mansjson=gson.toJson(manList);
HttpUtil.sendPostHttpRequest("http://192.168.0.100:3000/qzone/ad", mansjson, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
}
@Override
public void onError(Exception e) {
}
});
这里没有写请求完成后的响应事件,如果要写关于界面的改动的话要通过Handler将Message发送回主线程。
怎样在Express里获取刚才的数据
这是在Express里设置路由接收刚才发送的Json数据和响应Get请求的方法:
(注意要将该路由注册在app.js中)
router.post('/ad/',function(req,res,next){
for (var i=0;i<req.body.length;++i){
var man=req.body[i];
console.log('name:'+man.name+'\n'+'age:'+man.age+'\n');
}
});
router.get('/ad/', function (req, res, next) {
var index = req.query.index;
var mans = [
[
{
name: 'flypie',
age: 20
},
{
name: '大飞哥',
age: 21
}
],
[
{
name: 'flypie2',
age: 20
},
{
name: '大飞哥2',
age: 21
}
]
];
res.json(mans[index]);
});
如果在路由里console.log(req.body);
可以看到如下数据:
[ { age: 20, name: 'post' }, { age: 20, name: 'post' } ]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。