項(xiàng)目中,經(jīng)常要提供一個(gè) API 供第三方使用,一個(gè)通用的 API 設(shè)計(jì)規(guī)范就是使用 REST API。REST API 是使用 HTTP 中的請(qǐng)求類型來(lái)標(biāo)識(shí)對(duì)資源的操作。如:
GET
/ticket
#獲取ticket列表GET
/ticket/12
#查看某個(gè)具體的ticketPOST
/ticket
#新建一個(gè)ticketPUT
/ticket/12
#更新ticket 12DELETE
/ticket/12
#刪除ticekt 12ThinkJS 中提供了很便捷的方式來(lái)創(chuàng)建 REST API,創(chuàng)建后無(wú)需額外的代碼即可響應(yīng) REST API 的處理,同時(shí)也可以通過(guò)定制響應(yīng)額外的需求。
通過(guò) thinkjs controller [name] --rest
即可創(chuàng)建一個(gè) REST API。如:
thinkjs controller home/ticket --rest
上面的命令表示在 home
模塊下創(chuàng)建了一個(gè) ticket
的 Rest Controller,該 Controller 用來(lái)處理資源 ticket
的請(qǐng)求。
Rest Controller 創(chuàng)建完成后,無(wú)需寫任何的代碼,即可完成對(duì) REST API 的處理。資源名稱和數(shù)據(jù)表名稱是一一對(duì)應(yīng)的,如:資源名為 ticket
,那么對(duì)應(yīng)的數(shù)據(jù)表為 數(shù)據(jù)表前綴
+ ticket
。
REST API 默認(rèn)是從 HTTP METHOD 里獲取當(dāng)前的請(qǐng)求類型的,如:當(dāng)前請(qǐng)求類型是 DELETE
,表示對(duì)資源進(jìn)行刪除操作。
如果有些客戶端不支持發(fā)送 DELETE
請(qǐng)求類型,那么可以通過(guò)屬性 _method
指定一個(gè)參數(shù)用來(lái)接收請(qǐng)求類型。如:
export default class extends think.controller.rest {
init(http){
super.init(http);
this._method = "_method"; //指定請(qǐng)求類型從 GET 參數(shù) _method 里獲取
}
}
默認(rèn)情況下,獲取資源信息時(shí),會(huì)將資源的所有字段都返回。有時(shí)候需要隱藏部分字段,可以通過(guò)在__before
魔術(shù)方法里完成此類操作。
export default class extends think.controller.rest {
__before(){
this.modelInstance.fieldReverse("password,score"); //隱藏 password 和 score 字段
}
}
有些 REST API 需要進(jìn)行權(quán)限驗(yàn)證,驗(yàn)證完成后才能獲取對(duì)應(yīng)的信息,可以通過(guò)在 __before
魔術(shù)方法里進(jìn)行驗(yàn)證。
export default class extends think.controller.rest {
* __before(){
let auth = yield this.checkAuth();
if(!auth){
return this.fail("no permissions"); //沒(méi)權(quán)限時(shí)直接返回
}
}
}
更多定制方式請(qǐng)參見(jiàn) API -> controller.rest。
更多建議: