2016年12月13日 星期二

Android + Node.js with Volley(排球?) 簡單RESTFul API 實作

首先我要來講一位滿懷熱血,想要打倒任何人,身高1米7卻想要違反地心引力,在空中的爭奪戰不想輸給任何一位....痾大家不要轉台。現在開始正題
其實網路上很多大大們分享,其實我也使用一段時間了,用於下載網路圖片或是簡單的網路連線,那會寫這篇是想連同上一篇寫一個RESTFul API 讓手機得到想要的資料!

介紹

由於HttpURLConnection和HttpClient用法過於複雜, 如果沒有適當的封裝, 容易寫出重覆的程式碼,因此Google推出Volley Http request framework來處理簡單的HTTP Request, 另外也可以下載圖片, volley是屬於輕量級的HTTP Request處理工具, 因此對於大量數據處理, 例如下載文件, 效能就沒有那麼理想。
使用

gradle
compile 'com.mcxiaoke.volley:library:1.0.19'
權限(Permission)因為要使用網路連線
<uses-permission android:name="android.permission.INTERNET" />
程式碼(Code)

首先取得Volley 的 RequestQueue物件
RequestQueue mQueue = Volley.newRequestQueue(this);
**注意** 
RequestQueue是一個請求隊列對象,可以緩存所有的HTTP請求,然後按照一定的算法並發地發出這些請求。不必為每一次HTTP請求都創建一個RequestQueue對象,這是非常浪費資源的,基本上在每一個需要和網絡交互的Activity中創建一個RequestQueue對象就足夠了。建議將mQueue設為單一物件全域使用,避免浪費資源。

為了發出Http 請求,還需要StringRequest物件
StringRequest stringRequest = new StringRequest("http://192.168.0.13:8081/listUsers",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("volley",response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("volley",error.getMessage(), error);
}
});
StringRequest的函數需要傳入三個參數,第一個參數就是URL地址,第二個參數是服務器響應成功的callback,第三個參數是服務器響應失敗的callback。
**注意** http://192.168.0.13 為區網IP,每台電腦不一樣,可由CMD 打上 ipconfig 查看

最後,將這個StringRequest對象添加到RequestQueue裡面就可以了,如下所示:

mQueue.add(stringRequest);
手機的部分就差不多了,那我們來看"http://192.168.0.13:8081/listUsers"這支RESTFul API 如何寫

如果大家還沒裝Node.js 以及 express 可以看Node.js + Express 基本認識 in windows

這裡我要做簡單的網路連線跟server要資料(檔案裡的內容)
首先開啟記事本並記得改檔名(account.json),並打上以下json格式
[{"name":"andy","pass":"08160816"}]
這份就是client跟server要資料回傳的內容

重頭戲來了
接下來一樣打開記事本並記得改檔名(workserver.js),並打上以下程式碼

var express = require('express');
var app = express();
var fs = require("fs");

//添加的新用户数据
var user = {
    "name" : "yuyu",
 "pass" : "password1"
}

app.get('/addUser', function (req, res) {
   fs.readFile( __dirname + "/" + "account.json", 'utf8', function (err, data) {
       data = JSON.parse(data.toString().trim());
       data.push(user);
       console.log( data );
    fs.writeFile(__dirname + "/" + "account.json", JSON.stringify(data), 'utf8', function(err) {
    if (err) throw err;
    console.log('complete');
    });
       res.end( JSON.stringify(data));
   });
   
})

app.get('/listUsers', function (req, res) {
   fs.readFile( __dirname + "/" + "account.json", 'utf8', function (err, data) {
       console.log( data );
       res.end( data );
   });
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("IP http://%s:%s", host, port)

})
有注意到 app.get('/listUsers'.....這段嗎?解釋為:當對localhost:8081/listUsers發出GET請求,Server回復account.json檔案內容

接下來就打開node.js cmd ,切換到檔案的位置並執行
node workserver.js
這裡以網頁顯示這支RESTFul API 的回傳結果

**注意**  
若是想要在自己電腦並用手機測試,記得兩個裝置(電腦、手機)需是同網段(連到同個wifi),並用區網連線的方式就可以進行連線。若是自己有實體IP就沒這個問題!


以上就是簡單Server 與 Client 端 連線,寫出一個可以進行溝通的程式,若有什麼問題可以互相討論,之後有空會出一篇有關使用Volley來下載網路圖片!

Refrence:
http://blog.csdn.net/guolin_blog/article/details/17482095
https://bng86.gitbooks.io/android-third-party-/content/volley.html













沒有留言:

張貼留言