zoukankan      html  css  js  c++  java
  • Request —— 让 Node.js http请求变得超简单

    先前一直比较关注前端的东西,对后端了解较少。不过一直对Node.js比较感兴趣,去年12月还去参加了阿里的CNODE交流聚会。

    以后希望通过这里的博客分享一些学习Node.js的笔记。一方面总结了自己的学习心得,另一方面也可以和大家一起分享交流。

    嗯,大概就是这样子。

    这篇就先介绍一个Node.js的模块——request。有了这个模块,http请求变的超简单。

    使用超简单

    Request使用超简单,同时支持https和重定向。

    var request = require('request');
    request('http://www.google.com', function (error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(body) // 打印google首页
      }
    })
    

    任何响应都可以输出到文件流。

    request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))
    

    反过来,也可以将文件传给PUT或POST请求。未提供header的情况下,会检测文件后缀名,在PUT请求中设置相应的content-type

    fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))
    

    请求也可以pipe给自己。这种情况下会保留原content-typecontent-length

    request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))
    

    表单

    request支持application/x-www-form-urlencodedmultipart/form-data实现表单上传。

    x-www-form-urlencoded很简单:

    request.post('http://service.com/upload', {form:{key:'value'}})
    

    或者:

    request.post('http://service.com/upload').form({key:'value'})
    

    使用multipart/form-data不用操心设置header之类的琐事,request会帮你解决。

    var r = request.post('http://service.com/upload')
    var form = r.form()
    form.append('my_field', 'my_value')
    form.append('my_buffer', new Buffer([1, 2, 3]))
    form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))
    form.append('remote_file', request('http://google.com/doodle.png'))
    

    HTTP认证

    request.get('http://some.server.com/').auth('username', 'password', false);
    

    request.get('http://some.server.com/', {
      'auth': {
        'user': 'username',
        'pass': 'password',
        'sendImmediately': false
      }
    });
    

    sendImmediately,默认为真,发送一个基本的认证header。设为false之后,收到401会重试(服务器的401响应必须包含WWW-Authenticate指定认证方法)。

    sendImmediately为真时支持Digest认证。

    OAuth登录

    // Twitter OAuth
    var qs = require('querystring')
      , oauth =
        { callback: 'http://mysite.com/callback/'
        , consumer_key: CONSUMER_KEY
        , consumer_secret: CONSUMER_SECRET
        }
      , url = 'https://api.twitter.com/oauth/request_token'
      ;
    request.post({url:url, oauth:oauth}, function (e, r, body) {
      // Ideally, you would take the body in the response
      // and construct a URL that a user clicks on (like a sign in button).
      // The verifier is only available in the response after a user has
      // verified with twitter that they are authorizing your app.
      var access_token = qs.parse(body)
        , oauth =
          { consumer_key: CONSUMER_KEY
          , consumer_secret: CONSUMER_SECRET
          , token: access_token.oauth_token
          , verifier: access_token.oauth_verifier
          }
        , url = 'https://api.twitter.com/oauth/access_token'
        ;
      request.post({url:url, oauth:oauth}, function (e, r, body) {
        var perm_token = qs.parse(body)
          , oauth =
            { consumer_key: CONSUMER_KEY
            , consumer_secret: CONSUMER_SECRET
            , token: perm_token.oauth_token
            , token_secret: perm_token.oauth_token_secret
            }
          , url = 'https://api.twitter.com/1/users/show.json?'
          , params =
            { screen_name: perm_token.screen_name
            , user_id: perm_token.user_id
            }
          ;
        url += qs.stringify(params)
        request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {
          console.log(user)
        })
      })
    })
    

    定制HTTP header

    User-Agent之类可以在options对象中设置。在下面的例子中,我们调用github API找出某仓库的收藏数和派生数。我们使用了定制的User-Agent和https.

    var request = require('request');
    
    var options = {
        url: 'https://api.github.com/repos/mikeal/request',
        headers: {
            'User-Agent': 'request'
        }
    };
    
    function callback(error, response, body) {
        if (!error && response.statusCode == 200) {
            var info = JSON.parse(body);
            console.log(info.stargazers_count + " Stars");
            console.log(info.forks_count + " Forks");
        }
    }
    
    request(options, callback);
    

    cookies

    默认情况下,cookies是禁用的。在defaultsoptionsjar设为true,使后续的请求都使用cookie.

    var request = request.defaults({jar: true})
    request('http://www.google.com', function () {
      request('http://images.google.com')
    })
    

    通过创建request.jar()的新实例,可以使用定制的cookie,而不是request全局的cookie jar。

    var j = request.jar()
    var request = request.defaults({jar:j})
    request('http://www.google.com', function () {
      request('http://images.google.com')
    })
    

    或者

    var j = request.jar()
    var cookie = request.cookie('your_cookie_here')
    j.setCookie(cookie, uri, function (err, cookie){})
    request({url: 'http://www.google.com', jar: j}, function () {
      request('http://images.google.com')
    })
    

    注意,setCookie至少需要三个参数,最后一个是回调函数。

    项目主页

    request的GitHub主页

  • 相关阅读:
    bzoj 1503: [NOI 2004]郁闷的出纳员
    bzoj 1001: [BeiJing2006]狼抓兔子
    bzoj 1005: [HNOI2008]明明的烦恼
    bzoj 1004: [HNOI2008]Cards
    bzoj 1003: [ZJOI2006]物流运输trans
    06day1
    05day2
    04day2
    04day1
    03day2
  • 原文地址:https://www.cnblogs.com/liuchuanfeng/p/6686009.html
Copyright © 2011-2022 走看看