標籤:UI filename 使用者名稱 agent class ble logs wan username
SuperAgent
最近在寫爬蟲,看了下node
裡面有啥關於ajax
的模組,發現superagent
這個模組灰常的好用。好東西要和大家分享,話不多說,開始吧~
什麼是SuperAgent
superagent
它是一個強大並且可讀性很好的輕量級ajax
API,是一個關於HTTP
方面的一個庫,而且它可以將鏈式寫法玩的出神入化。
var superagent = require(‘superagent‘); superagent .post(‘/api‘) .send({ ‘key‘: ‘value‘ }) .set(‘header_key‘, ‘header_value‘) .end(function(err, res) { if (err) { //do something } else { //do something } })
安裝SuperAgent
相信大家看到這篇部落格的時候肯定對Node
和npm
有一定的瞭解了,所以直接使用npm
安裝SuperAgent
到項目的包依賴中就好了。
$ npm install superagent --save
開始學習SuperAgent吧!
一般來說,我們常有的HTTP
請求包括GET
POST
DELETE
HEAD
PUT
這些。 在不同的應用情境,在發送請求的時候,會選擇一個正確的請求方式,然後通過.end()
函數來得到請求後的返回結果。
superagent .get(‘/api‘) //這裡的URL也可以是絕對路徑 .end(function(req,res){ //do something }) // 等價於==> superagent(‘GET‘,‘/api‘)//這裡的URL也可以是絕對路徑 .end(function(req,res){ //do something })
接下來,讓我們逐一的對SuperAgent
的一些特性進行分析吧~??
佈建要求頭
這一點在寫爬蟲的時候十分的有用,因為有些網站可能設定了一些限制條件,比如它會去匹配你的要求標頭裡面的一些欄位, 像User-Agent
Referer
等,如果你沒有設定這些要求標頭的話,可能就抓取不到資料咯~
SuperAgent
裡面佈建要求頭很簡單,通過使用set()
方法就可以設定了,有兩種方式
單個單個的設定
superagent .get(‘/api‘) .set(‘Referer‘,‘https://www.google.com‘) .set(‘Accept‘,‘image/webp,image/*,*/*;q=0.8‘) .end(function(req,res){ //do something })
放在一起設定
superagent
.get(‘/api‘) .set({ ‘Referer‘,‘https://www.google.com‘, ‘Accept‘,‘image/webp,image/*,*/*;q=0.8‘ }) .end(function(req,res){ //do something })
GET
請求方式
我相信大家都一定見過這樣類型的URL:http://localhost:8080/api
和http://localhost:8080/api?id=1&price=10
,就是GET
方式可以帶上參數,也可以不帶上參數。不帶參數的就不說了,相信大家都會,在superagent
中我們可以通過query()
方法給URL
後面帶上參數,有4種寫法
//接下來所形成的URL為/api?name=An&age=20&sex=male //第一種 superagent .get(/api) .query({name:‘An‘}) .query({age:20}) .query({sex:‘male‘}) .end(cb) //第二種 superagent .get(/api) .query({name:‘An‘,age:20,sex:‘male‘}) .end(cb) //第三種 superagent .get(/api) .query(‘name=An&age=20&sex=male‘) .end(cb) //第四種 superagent .get(/api) .query(‘name=An‘) .query(‘age=20‘) .query(‘sex=male‘) .end(cb)
head
請求
head
請求也可以通過query()
的方式進行傳遞參數,大家可以參考??的GET
請求
POST/PUT
請求
這兩種請求,一般是要給服務端發送資料,現在文本資料的方式一般都以json
的方式傳遞。我們可以在要求標頭裡設定Accept=application/json
,從而伺服器可以根據要求標頭來產生json
資料(在java開發後台時可以這樣)
在superagent
裡面,預設的資料傳遞格式是json
,所以下面幾種種方式是相同的。
superagent .post(‘/api‘) .set(‘Accept‘,‘application/json‘) .send(‘{"name":"An","age":20,"sex":"male"}‘) .end(cb) //等價於 ==> superagent .post(‘/api‘) .send({name:"An",age:20,sex:"male"}) .end(cb) //等價於 ==> superagent .post(‘/api‘) .send({name:"An"}) .send({age:20}) .sex({sex:‘male‘}) .end(cb)
當然,除了json
的形式去傳遞,我們還有一種很常見的表單提交,在superagent
裡,也實現了類比表單的提交資料類型application/x-www-form-urlencoded
, 我們可以通過type(‘form‘)
方法進行轉換
superagent .post(‘/api‘) .type(‘form‘) .send({name:‘An‘,age:20}) // name=An&age=20 .end(cb)
有時候,我們也會在POST
請求時,將一些參數放在URL
上面,那這個時候還是可以用query()
方法
設定Content-Type
的兩種快速方式
type()
方法
accept()
方法
這兩種方法都可以接受規範的MIME格式,以及圖片和xml
等這些格式的資料。
superagent
.post(‘/api‘) .type(‘application/json‘) .type(‘png‘)
// 等價於==>
superagent
.post(‘/api‘) .accept(‘application/json‘) .accept(‘png‘)
分析處理response body
superagent
可以幫你解析返回的資料,當前支援三種類型的資料application/x-www-form-urlencoded
application/json
和multipart/form-data
JSON/Urlencoded
解析後的資料會以對象的形式存在,可以通過res.body
來得到。
‘{"name":"An"}‘ //JSON String //解析 ==> { name:"An" //JSON Object }
-
Multipart
這種格式的資料的處理,superagent
是通過Formidable模組,它是主要處理檔案上傳的模組,大家可以去瞭解下,也是Node
裡面十分常用的模組,也很簡單易上手。上傳的檔案的資訊可以在res.files
去查看,當然,我覺得這個屬性用的比較少,這隻是個人觀點了~
Response
的屬性
終止請求 req.abort()
暫停請求 req.timeout(ms)
ms
表示毫秒為單位的時間
Basic Access Authentication
首先先簡單的介紹下Basic Access Authenication
,它是在web
應用中,通過直接提供使用者名稱、密碼來進行驗證身份的一種最佳化的解決方案。
原理是將使用者名稱和密碼通過:
串連,形成username:password
然後再進行base64
加密,發送到伺服器後再進行解密得到使用者名稱和密碼,進行進一步的匹配驗證。參考文章:HTTP Basic Authentication認證。
在superagent
裡,有兩種方式進行驗證
superagent .get(‘http://username:[email protected]‘) .end(cb) //等價於 ==> superagent .get(‘http://localhost‘) .auth(‘username‘,‘password‘) .end(cb)
可以通過pipe
管道流入流出資料
我想大家應該知道node
裡面有個核心特性就是stream
,如果不知道的,可以參考:nodejs中流(stream)的理解,舉兩個栗子:
//第一個例子 var fs = require(‘fs‘); var request = require(‘superagent‘); var postJson = fs.createReadStream(‘./postDataJson‘); var req= request.post(‘/api‘); req.accept(‘json‘); stream.pipe(req); //第二個例子 var fs = require(‘fs‘); var request = require(‘superagent‘); var getData = fs.createWriteStream(‘./getData‘); var res= request.get(‘/api‘); res.pipe(getData);
添加多個附件
superagent
也提供了一些進階的API
,如果你想添加多個附件可以使用attach(name,[path],[filename])
,其中你可以通過filename
來自訂上傳後檔案的檔案名稱
request .post(‘/upload‘) .attach(‘avator‘,‘/path/a.png‘,‘An.png‘) .attach(‘photo‘,‘/path/b.png‘) .end(cb)
複合請求
superagent
也支援複合請求,比如你想上傳一個帶有你的姓名和郵箱的圖片,那可以通過field(name,value)
方法
request .post(‘/upload‘) .field(‘name‘,‘An‘) .field(‘age‘:20) .attach(‘avator‘,‘/path/a.png‘,‘An.png‘) .end(cb)
錯誤處理
有時候我們可能會因為不同的原因得到4XX
或者5XX
的錯誤,這個時候我們確實是可以從end(function(err,res){...})
裡的err
得到錯誤資訊,比如er.status
錯誤的狀態代碼啥的,但是有些時候我們想去處理這些錯誤,重新發送一個別的請求啥的,那麼這個時候我們可以通過on(‘error‘,handleFn)
去處理了
request .post(‘/api‘) .send(data) .on(‘error‘,handleFn) .end(cb);
最後
我相信看到這裡,大家對於superagent
這個模組應該不陌生了吧,那大家還在等什麼,快去用它做一個小爬蟲吧,檢驗下你學習的成果! 當然,如果你在寫爬蟲之前去學習一些cheerio,就可以少寫點噁心的Regex了。
附上blog
的github地址
如果這篇文章對你有所協助,希望你能給我一個star,如果你有啥建議,歡迎和我交流哦。??????
一個胖子的我
連結:http://www.jianshu.com/p/98b854322260
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
好用的 HTTP模組SuperAgent