SuperAgent 的使用文檔

superagent是nodejs里一個(gè)非常方便的客戶端請(qǐng)求代理模塊肋杖,當(dāng)你想處理get,post,put,delete,head請(qǐng)求時(shí),你就應(yīng)該想起該用它了.

SuperAgent

superagent 是一個(gè)輕量的,漸進(jìn)式的ajax api,可讀性好,學(xué)習(xí)曲線低,內(nèi)部依賴nodejs原生的請(qǐng)求api,適用于nodejs環(huán)境下.

一個(gè)簡(jiǎn)單的post請(qǐng)求烂叔,并設(shè)置請(qǐng)求頭信息的例子

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請(qǐng)求

當(dāng)使用 get 請(qǐng)求傳遞查詢字符串的時(shí)候箩绍,用 . query()方法,傳遞一個(gè)對(duì)象就可以,下面的代碼將產(chǎn)生一個(gè) /search?query=Manny&range=1..5&order=desc 的請(qǐng)求

request?

? ? .get('/search')

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

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

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

? ? .end(function(res){

?});

或者傳遞一個(gè)單獨(dú)的大對(duì)象:

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

也可以達(dá)到和上面一樣的效果

.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請(qǐng)求

一個(gè)典型的json post請(qǐng)求看起來(lái)就像下面的那樣,設(shè)置一個(gè)合適的Content-type頭字段农尖,然后寫入一些數(shù)據(jù),在這個(gè)例子里只是json字符串:

request

.post('/post地址')

.set('Content-Type','application/json')//因?yàn)閖son非常通用良哲,所以就作為默認(rèn)的Content-type,所以這一句不設(shè)置也會(huì)達(dá)到當(dāng)前的效果

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

.end(function(res){

})

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

request

.post('/post地址')

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

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

.end(function(res){

})

默認(rèn)發(fā)送字符串盛卡,將設(shè)置Content-type為application/x-www-form-urlencoded,多次調(diào)用將會(huì)通過&來(lái)連接,這里的結(jié)果為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的請(qǐng)求數(shù)據(jù)格式化是可以擴(kuò)展的筑凫,不過默認(rèn)支持form和json兩種格式,想發(fā)送數(shù)據(jù)以application/x-www-form-urlencoded類型的話滑沧,則可以簡(jiǎn)單的調(diào)用.type()方法傳遞form參數(shù)就行,這里默認(rèn)是json,下面的請(qǐng)求將會(huì)postname=tj&pet=tobi內(nèi)容:

request

.post('/post地址')

.type('form')

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

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

.end(function(res){

})

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

設(shè)置Content-Type

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

request.post(“/user”)

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

一個(gè)簡(jiǎn)便的方法是調(diào)用.type()方法巍实,傳遞一個(gè)規(guī)范的MIME名稱滓技。包括type/subtype,或者一個(gè)簡(jiǎn)單的后綴就像xml,json,png這樣棚潦,例如:

request

? ?.post('/user')

? ? .type('application/json')


request

? ?.post('/user')

? ? .type('json')


request

? ?.post('/user')

.type('png')

設(shè)置接受類型

和.type()簡(jiǎn)便的方法一樣令漂,這里也可以調(diào)用.accept()方法來(lái)設(shè)置接受類型,這個(gè)值將會(huì)被request.types()所引用,支持傳遞一個(gè)規(guī)范的MIME名稱洗显,包括type/subtype外潜,或者一個(gè)簡(jiǎn)單的后綴就像xml,json挠唆,png這樣处窥,例如:

request

? ?.get('/user')

? ?.accept('application/json')


request

? .get('/user')

? .accept('json')


request

? ?.get('/user')

? ?.accept('png')

解析響應(yīng)內(nèi)容

superagent會(huì)解析一些常用的格式給請(qǐng)求者,當(dāng)前支持application/x-www-form-urlencoded,application/json,multipart/form-data.

JSON/Urlencoded

res.body 是解析后的內(nèi)容對(duì)象玄组,比如一個(gè)請(qǐng)求響應(yīng)‘{”user“:{”name“: "tobi"}}’字符串滔驾,res.body.user.name 將會(huì)返回tobi,同樣的俄讹,x-www-form-urlencoded格式的user[name]=tobi解析完的值哆致,也是一樣的.

響應(yīng)屬性

響應(yīng)一般會(huì)提供很多有用的標(biāo)識(shí)以及屬性,都在response對(duì)象里,按照respone.text,解析后的response.body,頭字段患膛,一些標(biāo)識(shí)的順序來(lái)排列.

Response text

res.text包含未解析前的響應(yīng)內(nèi)容摊阀,一般只在mime類型能夠匹配text/,json,x-www-form-urlencoding的情況下,默認(rèn)為nodejs客戶端提供,這是為了節(jié)省內(nèi)存.因?yàn)楫?dāng)響應(yīng)以文件或者圖片大內(nèi)容的情況下影響性能.

Response body

跟請(qǐng)求數(shù)據(jù)自動(dòng)序列化一樣踪蹬,響應(yīng)數(shù)據(jù)也會(huì)自動(dòng)的解析胞此,當(dāng)為一個(gè)Content-Type定義一個(gè)解析器后,就能自動(dòng)解析跃捣,默認(rèn)解析包含application/json和application/x-www-form-urlencoded,可以通過訪問res.body來(lái)訪問解析對(duì)象.

Response header fields

res.header包含解析之后的響應(yīng)頭數(shù)據(jù),鍵值都是node處理成小寫字母形式漱牵,比如res.header['content-length'].

Response Content-Type

Content-Type響應(yīng)頭字段是一個(gè)特列,服務(wù)器提供res.type來(lái)訪問它疚漆,默認(rèn)res.charset是空的,如果有的話酣胀,則自動(dòng)填充,例如Content-Type值為text/html; charset=utf8,則res.type為text/html,res.charst為utf8.

Response status

響應(yīng)狀態(tài)標(biāo)識(shí)可以用來(lái)判斷請(qǐng)求是否成功娶聘,除此之外闻镶,可以用superagent來(lái)構(gòu)建理想的restful服務(wù)器,這些標(biāo)識(shí)目前定義為:

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;

中止請(qǐng)求

可以通過req.abort()來(lái)中止請(qǐng)求.

請(qǐng)求超時(shí)

可以通過req.timeout()來(lái)定義超時(shí)時(shí)間,然后當(dāng)超時(shí)錯(cuò)誤發(fā)生時(shí),為了區(qū)別于別的錯(cuò)誤,err.timeout屬性被定義為超時(shí)時(shí)間,注意,當(dāng)超時(shí)錯(cuò)誤發(fā)生后丸升,后續(xù)的請(qǐng)求都會(huì)被重定向.不是每個(gè)請(qǐng)求.

附加文件

上面提及的高級(jí)api方法铆农,可以通用.attach(name, [path], [filename])和.field(name, value)這兩種形式來(lái)調(diào)用.添加多個(gè)附件也比較簡(jiǎn)單,只需要給附件提供自定義的文件名稱,同樣的基礎(chǔ)名稱也要提供.

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()方法可以激活發(fā)送原始cookie的能力,不過只有在Access-Control-Allow-Origin不是一個(gè)通配符(*),并且Access-Control-Allow-Credentials為’true’的情況下才行.

request

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

? ?.withCredentials()

? ? .end(function(res){

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

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

? ? ? ? next();

})

更多內(nèi)容可以參考: https://cnodejs.org/topic/5378720ed6e2d16149fa16bd

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末发钝,一起剝皮案震驚了整個(gè)濱河市顿涣,隨后出現(xiàn)的幾起案子波闹,更是在濱河造成了極大的恐慌酝豪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件精堕,死亡現(xiàn)場(chǎng)離奇詭異孵淘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)歹篓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門瘫证,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)揉阎,“玉大人,你說(shuō)我怎么就攤上這事背捌”凶眩” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵毡庆,是天一觀的道長(zhǎng)坑赡。 經(jīng)常有香客問我,道長(zhǎng)么抗,這世上最難降的妖魔是什么毅否? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮蝇刀,結(jié)果婚禮上螟加,老公的妹妹穿的比我還像新娘。我一直安慰自己吞琐,他們只是感情好捆探,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顽分,像睡著了一般徐许。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卒蘸,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天雌隅,我揣著相機(jī)與錄音,去河邊找鬼缸沃。 笑死恰起,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趾牧。 我是一名探鬼主播检盼,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翘单!你這毒婦竟也來(lái)了吨枉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哄芜,失蹤者是張志新(化名)和其女友劉穎貌亭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體认臊,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡圃庭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剧腻。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拘央,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出书在,到底是詐尸還是另有隱情灰伟,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布儒旬,位于F島的核電站袱箱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏义矛。R本人自食惡果不足惜发笔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凉翻。 院中可真熱鬧了讨,春花似錦、人聲如沸制轰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垃杖。三九已至男杈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間调俘,已是汗流浹背伶棒。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彩库,地道東北人肤无。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骇钦,于是被迫代替她去往敵國(guó)和親宛渐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容