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













2016年12月8日 星期四

Node.js + Express 基本認識 in windows

Node.js 在我大學時就聽過,也距離3、4年前了,因為工作上需求開始了解Node.js,並與我比較掌握的Android有所連接。(PS不想看簡介與優點請直接下拉到安裝與教學)

簡介

Node.js 是 Ryan Dahl 基於 Google 的 V8 引擎於 2009 年釋出的一個 JavaScript 開發平台,主要聚焦於 Web 程式的開發,通常用被來寫網站。以往大家都學過PHP、Python 和 Ruby 等的腳本語言一樣,需要有 Web Server 才能寫出 Web 程式,Node.js 透過模組的支援,Node.js 自己就可以寫出Web Server並且可以控制它的行為與運作方式,甚至還可以針對不同的功能用不同Port來建立多個服務,看起來是不是不錯,接下來繼續講Node.js的優點。

優點

高效能
因為 Node.js 採用「非同步式 I/O」的方式,所以,不會因為硬體設備的延遲而造成程式因為需要等待回應而影響到程式的執行,因此,執行速度較常見的同步式來的快。

低耗能
除了非同步式I/O之外,Node.js 還採用 Evented I/O 的模式,因此,Node.js 不需要像一般的 Web Server 需要一大塊記憶體來放著用,而Node.js 只在需要時才會去使用必要的資源,相對比起來較省資源。

入門容易
 JavaScript 是一套可深可淺的語言,就是,不需要很懂也可以寫出想要的東西,但是,如果很懂就可以寫出很多令人不可思議的應用(OOP),而 Node.js 因為採用 Javascript ,因此,對於 Web 程式開發者來說,幾乎是無痛的學會另一種應用哩 !

社群支援強
Node.js 有一個叫做 NPM 的網站,專門讓人來提供自己開發的套件 (Package),目前在 NPM 上面已經有 5000 多個套件,所以,可以容易找到需要的功能來用,不需要自己重頭寫,可以加快開發的速度哩 !

安裝與教學

首先到官網安裝Node.js,安裝過程沒有甚麼特別的,接下來你會看到兩個Node.js、 Node.js Commad Prompt


接下來我們就使用Node.js Commad Prompt來寫一隻Hello World!來吧
首先在Node.js的目錄下新增一個文字文件來(*註 若要顯示中文請選擇UTF8),在內文中打上
console.log("Hello World!");
接下來改檔名-->"hello.js"`,並在Node.js cmd 打上
node hello.js


接下來第二個重頭戲
我們來建立一個web,在網頁上顯示Hello World!
首先跟上面一樣的步驟,內文打上
var http = require("http");
http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);
1.使用require指令來載入http的模組
2.創建伺服器:使用http.createServer()方法建立伺服器,並使用listen(8888)綁定8888port,函數通過request、reponse來接收和響應數據
3.啟動:在Node,js cmd 打上 node hello.js
這樣我們就完成了第一個Node.js基本階段,下一階段開始使用套件加速開發網頁

Express 介紹、安裝與教學

Express是目前最穩定、使用最廣泛開發框架,並且是Node.js官方唯一推薦的Web開發框架。BYVoid在Node.js開發指南中提到
Express除了為HTTP模組提供了更高階的接口外,還實現了許多功能,其中包含:路由控制、模板解析支持、動態視圖、用戶會話、CSRF保護、靜態文件服務、錯誤控制器、訪問日誌、緩存、插件支持。
特別在此註明,Express不是一個無所不包的全能框架,像Rails或Django的那樣實現了模板引擎甚至ORM (Object Relation Model,對象關係模型),它只是一個輕量級的框架,多數功能只是對HTTP協議中常用操作的封裝,更多的功能需要插件或整合其他模組來完成。
首先打開我們的Node.js cmd 輸入
npm install express --save 
以上命令會將 Express 框架安裝在當前目錄的 node_modules 目錄中, node_modules 目錄下會自動創建 express 目錄。以下幾個重要的模塊是需要與 express 框架一起安裝的:
body-parser:用於處理 JSON, Raw, Text 和 URL 編碼的數據。
cookie-parser : 這就是一個解析Cookie的工具。通過req.cookies可以取到傳過來的cookie,並把它們轉成對象。
multer :用於處理 enctype="multipart/form-data"(設置表單的MIME編碼)的表單數據。
npm install body-parser --save
npm install cookie-parser --save npm install multer --save
那接下來我們來用Express 寫 Hello World
var http = require('http');
var express = require('express');
var app = express();
var server = http.createServer(app);
app.get('/',function(request, response){ //我們要處理URL為 "/" 的HTTP GET請求
    response.send('Hello World'); //作出回應
});
server.listen(8080,'127.0.0.1',function(){
    console.log('HTTP in http://127.0.0.1:8080/ run');
});
這裡大家應該對下面有所疑問
app.get('/', function (req, res) {
   // --
})
以下介紹routing(路由) 的概念

路由是指判斷應用程式如何回應用戶端對特定端點的要求,而這個特定端點是一個 URI(或路徑)與一個特定的 HTTP 要求方法(GET、POST 等)。

每一個路由可以有一或多個處理程式函數,當路由相符時,就會執行這些函數。

路由定義的結構如下:
app.METHOD(PATH, HANDLER)
其中:
  • app 是 express 的實例。
  • METHOD 是 HTTP 要求方法
  • PATH 是伺服器上的路徑。
  • HANDLER 是當路由相符時要執行的函數。
讓我們回到上面
app.get('/',function(request, response){ //我們要處理URL為 "/" 的HTTP GET請求
    response.send('Hello World'); //作出回應
});
其解釋為:對根目錄('/')發出GET要求時並回應"Hello World"
就這樣完成了Express 的 Hello World

看完這篇大致上會對於Node.js 跟 Express 有些基本認識,下次會介紹Express的框架並實做,感謝大家,Node,js 完全新手若有任何問題歡迎一起討論與學習。

Refrence:
http://expressjs.com/zh-tw/starter/basic-routing.html
http://www.runoob.com/nodejs/nodejs-express-framework.html
https://blog.allenchou.cc/nodejs-tuts-2-using-express-framework/
http://www.runoob.com/nodejs/nodejs-http-server.html