好用的 HTTP模組SuperAgent

來源:互聯網
上載者:User

標籤:UI   filename   使用者名稱   agent   class   ble   logs   wan   username   

SuperAgent

最近在寫爬蟲,看了下node裡面有啥關於ajax的模組,發現superagent這個模組灰常的好用。好東西要和大家分享,話不多說,開始吧~

什麼是SuperAgent

superagent它是一個強大並且可讀性很好的輕量級ajaxAPI,是一個關於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

相信大家看到這篇部落格的時候肯定對Nodenpm有一定的瞭解了,所以直接使用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/apihttp://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/jsonmultipart/form-data

    • JSON/Urlencoded
      解析後的資料會以對象的形式存在,可以通過res.body來得到。

        ‘{"name":"An"}‘ //JSON String  //解析 ==>  {      name:"An"    //JSON Object  }
    • Multipart
      這種格式的資料的處理,superagent是通過Formidable模組,它是主要處理檔案上傳的模組,大家可以去瞭解下,也是Node裡面十分常用的模組,也很簡單易上手。上傳的檔案的資訊可以在res.files去查看,當然,我覺得這個屬性用的比較少,這隻是個人觀點了~
  • Response的屬性

    • res.text包含為被解析的響應資料

    • res.body上文提到了,包含解析的資料,但是目前只支援三種格式

    • res.header回應標頭,是一個Object

    • res.type & res.charset 類型和編碼格式

    • res.status狀態代碼

  • 終止請求 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.