SuperAgent 的使用文檔

superagent是nodejs里一個非常方便的客戶端請求代理模塊,當你想處理get,post,put,delete,head請求時,你就應該想起該用它了.

SuperAgent

superagent 是一個輕量的,漸進式的ajax api,可讀性好,學習曲線低,內部依賴nodejs原生的請求api,適用于nodejs環境下.

一個簡單的post請求,并設置請求頭信息的例子

request

? ?.post('/api/pet')

? ? .send({name:'Manny',species:'cat'})

? ? ?.set('X-API-Key','foobar')

? ? ?.set('Accept','application/json')

? ? ? .end(function(res){

? ? ? ? ? if(res.ok){

? ? ? ? ? ? ?alert('yay got '+JSON.stringify(res.body));

? ? ? ? ?}else{

? ? ? ? ? ? alert('Oh no! error '+res.text);

? ? ? ? }

});

Get請求

當使用 get 請求傳遞查詢字符串的時候,用 . query()方法,傳遞一個對象就可以,下面的代碼將產生一個 /search?query=Manny&range=1..5&order=desc 的請求

request?

? ? .get('/search')

? ? .query({query:'Manny'})

? ? .query({range:'1..5'})

? ? .query({order:'desc'})

? ? .end(function(res){

?});

或者傳遞一個單獨的大對象:

.query({ query: 'Manny', range: '1..5', order: 'desc' })

也可以達到和上面一樣的效果

.query()方法也允許傳遞字符串:

request

.get('/querystring')

.query("search=Manny&range=1..5")

.end(function(res){

?})

還允許字符串拼接

request

.get('/querystring')

.query("search=Manny”)

.query(“range=1..5")

.end(function(res){

})

POST/PUT請求

一個典型的json post請求看起來就像下面的那樣,設置一個合適的Content-type頭字段,然后寫入一些數據,在這個例子里只是json字符串:

request

.post('/post地址')

.set('Content-Type','application/json')//因為json非常通用,所以就作為默認的Content-type,所以這一句不設置也會達到當前的效果

.send('{"name":"tj","pet":"tobi"}')

.end(function(res){

})

.send()方法可以多次調用

request

.post('/post地址')

.send('{"name":"tj"}')

.send('{"pet":"tobi"}')

.end(function(res){

})

默認發送字符串,將設置Content-type為application/x-www-form-urlencoded,多次調用將會通過&來連接,這里的結果為name=tj&pet=tobi:

request

.post('/post地址')

.set('Content-Type','application/x-www-form-urlencoded')

.send('{"name":"tj"}')

.send('{"pet":"tobi"}')

.end(function(res){

})

superagent的請求數據格式化是可以擴展的,不過默認支持form和json兩種格式,想發送數據以application/x-www-form-urlencoded類型的話,則可以簡單的調用.type()方法傳遞form參數就行,這里默認是json,下面的請求將會postname=tj&pet=tobi內容:

request

.post('/post地址')

.type('form')

.send('{"name":"tj"}')

.send('{"pet":"tobi"}')

.end(function(res){

})

注意:form是form-data和urlencoded的別名,為了向后兼容

設置Content-Type

常見的方案是使用.set()方法

request.post(“/user”)

.set('Content-Type', 'application/json')

一個簡便的方法是調用.type()方法,傳遞一個規范的MIME名稱。包括type/subtype,或者一個簡單的后綴就像xml,json,png這樣,例如:

request

? ?.post('/user')

? ? .type('application/json')


request

? ?.post('/user')

? ? .type('json')


request

? ?.post('/user')

.type('png')

設置接受類型

和.type()簡便的方法一樣,這里也可以調用.accept()方法來設置接受類型,這個值將會被request.types()所引用,支持傳遞一個規范的MIME名稱,包括type/subtype,或者一個簡單的后綴就像xml,json,png這樣,例如:

request

? ?.get('/user')

? ?.accept('application/json')


request

? .get('/user')

? .accept('json')


request

? ?.get('/user')

? ?.accept('png')

解析響應內容

superagent會解析一些常用的格式給請求者,當前支持application/x-www-form-urlencoded,application/json,multipart/form-data.

JSON/Urlencoded

res.body 是解析后的內容對象,比如一個請求響應‘{”user“:{”name“: "tobi"}}’字符串,res.body.user.name 將會返回tobi,同樣的,x-www-form-urlencoded格式的user[name]=tobi解析完的值,也是一樣的.

響應屬性

響應一般會提供很多有用的標識以及屬性,都在response對象里,按照respone.text,解析后的response.body,頭字段,一些標識的順序來排列.

Response text

res.text包含未解析前的響應內容,一般只在mime類型能夠匹配text/,json,x-www-form-urlencoding的情況下,默認為nodejs客戶端提供,這是為了節省內存.因為當響應以文件或者圖片大內容的情況下影響性能.

Response body

跟請求數據自動序列化一樣,響應數據也會自動的解析,當為一個Content-Type定義一個解析器后,就能自動解析,默認解析包含application/json和application/x-www-form-urlencoded,可以通過訪問res.body來訪問解析對象.

Response header fields

res.header包含解析之后的響應頭數據,鍵值都是node處理成小寫字母形式,比如res.header['content-length'].

Response Content-Type

Content-Type響應頭字段是一個特列,服務器提供res.type來訪問它,默認res.charset是空的,如果有的話,則自動填充,例如Content-Type值為text/html; charset=utf8,則res.type為text/html,res.charst為utf8.

Response status

響應狀態標識可以用來判斷請求是否成功,除此之外,可以用superagent來構建理想的restful服務器,這些標識目前定義為:

var type=status/100|0;

// status / class

res.status=status;

res.statusType=type;//basics

res.info=1==type;

res.ok=2==type;

res.clientError=4==type;

res.serverError=5==type;

res.error=4==type||5==type;//sugar

res.accepted=202==status;

res.noContent=204==status||1223==status;

res.badRequest=400==status;

res.unauthorized=401==status;

res.notAcceptable=406==status;

res.notFound=404==status;

res.forbidden=403==status;

中止請求

可以通過req.abort()來中止請求.

請求超時

可以通過req.timeout()來定義超時時間,然后當超時錯誤發生時,為了區別于別的錯誤,err.timeout屬性被定義為超時時間,注意,當超時錯誤發生后,后續的請求都會被重定向.不是每個請求.

附加文件

上面提及的高級api方法,可以通用.attach(name, [path], [filename])和.field(name, value)這兩種形式來調用.添加多個附件也比較簡單,只需要給附件提供自定義的文件名稱,同樣的基礎名稱也要提供.

request

? .post('/upload')

? .attach('avatar','path/to/tobi.png','user.png')

? ?.attach('image','path/to/loki.png')

? ?.attach('file','path/to/jane.png')

.end(callback);

跨域資源共享

.withCredentials()方法可以激活發送原始cookie的能力,不過只有在Access-Control-Allow-Origin不是一個通配符(*),并且Access-Control-Allow-Credentials為’true’的情況下才行.

request

? ?.get('http://localhost:4001/')

? ?.withCredentials()

? ? .end(function(res){

? ? ? ? assert(200==res.status);

? ? ? ? assert('tobi'==res.text);

? ? ? ? next();

})

更多內容可以參考: https://cnodejs.org/topic/5378720ed6e2d16149fa16bd

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容