鍵.png)
ASP.NET Web API快速入門介紹
OpenStack-Networking-Host-Name
OpenStack-Object-Storage-Policy
however, Node.js (as of writing this article) imposes an 80KB size limit on the headers object for practical reasons.
注意,HTTP規(guī)范并沒有對(duì)HTTP header大小進(jìn)行限制;盡管如此,出于對(duì)應(yīng)用場景的考慮,作者希望對(duì)HTTP header進(jìn)行80KB的大小限制。
” 不要允許設(shè)置任意大小的 HTTP header (包括狀態(tài)行) ,不要超過?HTTP_MAX_HEADER_SIZE
的限制。這種檢驗(yàn)師為了保護(hù)程序,防止‘阻斷服務(wù)攻擊(denial-of-service attack)’,攻擊者會(huì)填入一個(gè)無法加載完的請(qǐng)求頭,讓程序進(jìn)入一個(gè)永遠(yuǎn)在加載中的狀態(tài)。”
選擇最適合項(xiàng)目應(yīng)用場景的,才是最重要的。
Express,Koa 和 Hapi 都可以支持瀏覽器調(diào)用,并且他們都支持模板和后端渲染,這里我們之羅列一小部分他們的特性。如果你的應(yīng)用需要面向用戶(界面),這些特性對(duì)他們是有意義的。
另一面,Restify是一個(gè)專注于構(gòu)建REST服務(wù)的庫。它強(qiáng)制你使用嚴(yán)格模式構(gòu)建你的API服務(wù),以此保證整個(gè)系統(tǒng)的可維護(hù)性和可監(jiān)控性。 Restify也帶有自動(dòng)化工具?DTrace支持,動(dòng)態(tài)監(jiān)測你的程序。
Restify也被大量產(chǎn)品用在主程序里,比如npm和Netflix。
“Restify 讓你使用嚴(yán)格模式提供 API 服務(wù),保持程序的可維護(hù)性和可監(jiān)控性
檢驗(yàn)?zāi)愕?a href="http://m.dlbhg.com/blog/rest-api-examples/">REST API的最佳方式是進(jìn)行黑盒測試。
黑盒測試是一種測試方法,就是排除任何主觀因素和已知條件,檢測每個(gè)功能是否都能正常使用。 所以沒有任何外部依賴是假數(shù)據(jù)或者樁代碼(stub),整個(gè)程序是看一個(gè)整體。
一個(gè)可以幫助你進(jìn)行Node.js REST API黑盒測試的工具?supertest。
一個(gè)簡單的用來檢驗(yàn)用戶返回?cái)?shù)據(jù)的用例,如果使用mocha?完成的話,如下:
const request = require('supertest')describe('GET /user/:id', function() {
it('returns a user', function() {
// newer mocha versions accepts promises as well
return request(app)
.get('/user')
.set('Accept', 'application/json')
.expect(200, {
id: '1',
name: 'John Math'
}, done)
})})
通常,一個(gè)好的寫測試用例的方法,就是盡可能減少假設(shè)的狀態(tài)。并且,在某些場景中,當(dāng)你需要知道系統(tǒng)狀態(tài)的時(shí)候,黑盒測試可以發(fā)現(xiàn)系統(tǒng)設(shè)計(jì)的盲點(diǎn),所以你可以通過斷言,實(shí)現(xiàn)更高的測試覆蓋率。
所以,根據(jù)你的需要,可以用下列方式之一,用測試數(shù)據(jù)填充數(shù)據(jù)庫:
當(dāng)然,黑盒測試不意味這你不需要單元測試,你也需要給你的API寫單元測試腳本unit tests。
使用RisingStack的程序監(jiān)聽和Debug專家
你的REST API必須是無狀態(tài)的,身份認(rèn)證也一樣。JWT (JSON Web Token) 是個(gè)經(jīng)典的解決方案。
JWT 由三部分構(gòu)成:
在你的程序中加入 JWT-based 非常簡單:
const koa = require('koa')const jwt = require('koa-jwt')const app = koa()app.use(jwt({
secret: 'very-secret'}))// Protected middlewareapp.use(function *(){
// content of the token will be available on this.state.user
this.body = {
secret: '42'
}})
之后,在客戶端調(diào)的API會(huì)受到JWT保護(hù)。訪問受保護(hù)的端,你必須在請(qǐng)求頭Authorization
?字段提供token。
curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cC
你可能注意到了,JWT不依賴任何數(shù)據(jù)層。因?yàn)镴WT可以通過tokens自我驗(yàn)證,請(qǐng)求也可以包含請(qǐng)求有效時(shí)間。
當(dāng)然,你也可以通過HTTPS來保護(hù)你的API安全。
推薦一篇有價(jià)值的文章,詳解web安全認(rèn)證方法?。
You can think of these headers as preconditions: if they are met, the requests will be executed in a different way.
條件請(qǐng)求根據(jù)HTTP header不同,返回不同。你可以把這些HTTP header作為先決條件:當(dāng)條件符合,就會(huì)獲得相應(yīng)的返回。
對(duì)于條件請(qǐng)求,返回什么結(jié)果取決于HTTP header
These headers try to check whether a version of a resource stored on the server matches a given version of the same resource. Because of this reason, these headers can be:
這些header希望檢測,這一版本的資源是否存在服務(wù)端,并返回對(duì)應(yīng)版本的資源。所以,header可能包括如下信息:
對(duì)應(yīng)API:
Last-Modified
(標(biāo)識(shí)當(dāng)前資源最后修改時(shí)間)Etag
(實(shí)體標(biāo)簽,標(biāo)識(shí)版本)If-Modified-Since
(和Last-Modified
一起使用)If-None-Match
(和Etag
一起使用)The client below did not have any previous versions of the doc
resource, so neither the If-Modified-Since
, nor the If-None-Match
header was applied when the resource was sent. Then, the server responds with the Etag
and Last-Modified
headers properly set.
下面,客戶端先前沒有任何關(guān)于?doc
?資源的版本,所以在發(fā)送請(qǐng)求時(shí)沒有If-Modified-Since
, 和?If-None-Match
信息。之后服務(wù)端返回資源,并在響應(yīng)頭里寫Etag
和Last-Modified
?。
如果在請(qǐng)求的時(shí)候,客戶端設(shè)置了If-Modified-Since
和If-None-Match
,一旦請(qǐng)求這個(gè)資源, 這個(gè)驗(yàn)證這個(gè)資源的版本。如果版本相同,服務(wù)器只是回應(yīng)304?-?Not Modified
?狀態(tài),不返回其他信息。
請(qǐng)求頻率限制用于控制API可以被消費(fèi)多少次。
可以通過設(shè)置HTTP header告訴客戶端還有多少請(qǐng)求可以被消費(fèi):
X-Rate-Limit-Limit
同一個(gè)時(shí)間段所允許的請(qǐng)求的最大數(shù)目X-Rate-Limit-Remaining
在當(dāng)前時(shí)間段內(nèi)剩余的請(qǐng)求的數(shù)量X-Rate-Limit-Reset
為了得到最大請(qǐng)求數(shù)所等待的秒數(shù)大部分HTTP框架支持這種寫法(或通過插件支持)。舉個(gè)例子,如果你用Koa,可以使用?koa-ratelimit這個(gè)包。
注意,請(qǐng)求時(shí)間間隔可以根據(jù)API不同,設(shè)置不同。比如 GitHub時(shí)間間隔是1小時(shí),Twitter是15分鐘。
你寫的API是給別人用的,要對(duì)別人有價(jià)值。提供一個(gè)API文檔是十分重要的。
以下開源項(xiàng)目可以幫助你創(chuàng)建API文檔:
如果你想使用API自動(dòng)生成工具,推薦?Apiary。
在過去的幾年中,出現(xiàn)了兩個(gè)API查詢語言,F(xiàn)acebook的GraphQL和Netflix的Falcor。但我們?yōu)槭裁葱枰鼈儯?/p>
想象以下RESTful資源請(qǐng)求:
/org/1/space/2/docs/1/collaborators?include=email&page=1&limit=
這很容易失控——如果你希望按照相同的數(shù)據(jù)結(jié)構(gòu)返回?cái)?shù)據(jù)。這是GraphQL和Falcor解決的問題。
GraphQL是一門API查詢語言,運(yùn)行時(shí)為完成這些查詢現(xiàn)有數(shù)據(jù)。GraphQL提供了一套完整的,易于理解的,可以描述數(shù)據(jù)的API。讓客戶端有了完整描述自己需要的數(shù)據(jù)的能力,隨著時(shí)間的推移,這種方式可能演變成API,成為更強(qiáng)大的開發(fā)工具。了解更多
Falcor一個(gè)創(chuàng)新的數(shù)據(jù)抓取哭,支撐著Netflix UI。Falcor允許你通過一個(gè)Node服務(wù)上的虛擬JSON操作任何后臺(tái)數(shù)據(jù)。在客戶端,使用遠(yuǎn)程JSON對(duì)象,通過get,set, call查找數(shù)據(jù),數(shù)據(jù)就是API 。了解更多
如果你正想要開發(fā)Node.js REST API或者更新一個(gè)版本,我們收集了4個(gè)有價(jià)值的,現(xiàn)實(shí)中的例子:
本文章轉(zhuǎn)載微信公眾號(hào)@前端那些事兒
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)