RESTful,是目前最為流行的一種互連網軟體架構。因為它結構清晰、符合標準、易於理解、擴充方便,所以正得到越來越多網站的採用。學習RESTful,首先要學習REST。
資源(Resources) REST是"表現層狀態轉化",其實REST省略了主語。"表現層"其實指的是"資源"的"表現層"。一張圖片、一個文檔、一個視頻等。這些資源我們通過URI來定位,也就是一個URI表示一個資源。
表現層(Representation)
資源是做一個具體的實體資訊,他可以有多種的展現方式。例如一個txt文本資訊,他可以輸出成html、json、xml等格式,一個圖片他可以jpg、png等方式展現
URI確定一個資源,但是如何確定它的具體表現形式呢?應該在HTTP請求的頭資訊中用Accept和Content-Type欄位指定,這兩個欄位才是對"表現層"的描述。
狀態轉化(State Transfer)
訪問一個網站,就代表了用戶端和伺服器的一個互動過程。在這個過程中,肯定涉及到資料和狀態的變化。而HTTP協議是無狀態的,那麼這些狀態肯定儲存在伺服器端,所以如果用戶端想要通知伺服器端改變資料和狀態的變化,肯定要通過HTTP來通知它。具體來說,就是HTTP協議裡面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET用來擷取資源,POST用來建立資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源。
RESTful API
符合REST設計風格的Web API稱為RESTful API。也就是說,RESTful是REST架構風格在WEB上的應用
實現功能
訪問所有車流量資料
GET: /api/<Authen>/all
訪問近一周車流量資料
GET: /api/<Authen>/near
訪問指定路口(crossID)即指定網關所有車流量資料
GET: /api/<Authen>/cross/<crossID>
訪問指定路口(crossID)即指定網關近3分鐘即時車流量資料
GET: /api/<Authen>/cross/<crossID>/last3min
訪問指定路口(crossID)即指定網關一段時間車流量資料
GET: /api/<Authen>/cross/<crossID>/start=<startTime>&end=<endTime>
代碼部分
資料庫部分Flow.js
建立Schema:建立
var FlowSchema = new Schema({ CrossTrafficData:{ CrossID: String, DeviceType: String, DateTime: String, Interval: Number, DataList:{ Data:{ LaneNo: String, Volume: Number, AvgOccupancy: Number, AvgHeadTime: Number, AvgLength: Number, AvgSpeed: Number, Saturation: Number, Density: Number, Pcu: Number, AveQueueLength: Number, Volume1: Number, Volume2: Number, Volume3: Number, Volume4: Number, Volume5: Number } } } });
//exports對象:
var FlowOp = function(){};
//定義各種函數。prototype表示是給FlowOp對象用的,通過callback返回資料
FlowOp.prototype.<name_function> = function([parametres],callback){}
//定義一個Model對象方便使用Model封裝的方法
var FlowModel = mongodb.mongoose.model('flowCar',FlowSchema);
//Model對象的find方法,參數:條件,投射,CB
//下面這句表示篩選出參數id值和時間段的檔案,並且提取後去除_id和__v屬性。查詢結果返回給data_id_p,進入回呼函數
FlowModel.find({'CrossTrafficData.CrossID': id,'CrossTrafficData.DateTime': {"$gt": start, "$lte": end}},'-_id -__v',(err,data_id_p)=>{});
//回呼函數,將js的obj轉換為json,然後給callback賦值,傳遞json數值
var data_p_json= JSON.stringify({data_p});callback(err,data_p_json);
路由routedata.js
//Json轉XML,藉助jsontoxml包並加入xml聲明,之前傳遞的json就是obj
router.get('/cross/:id/start=:timestart&end=:timeend', (req, res) => { CarFlow.findByCrossByPeriod(req.params.id, req.params.timestart, req.params.timeend, (err, obj) => { var data_xml = jsontoxml(obj); res.set('Content-Type', 'text/xml'); var d = '<?xml version="1.0" encoding="utf-8"?>'; res.send(d + data_xml); });});
反思
可以在Schema建立函數,並且匯出一個Model對象是否封裝更好?
mySchema.methods.findByCByP = function(paras, cb){ return this.find({type: this.type}, cb);}
Reference
Rest:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.3.md