首页 > 上网技巧 > 电脑小技巧 > Request让Node.js http请求变得超简单

Request让Node.js http请求变得超简单

时间:2014-09-04 17:44 作者:QQ地带 我要评论

先前一直比较关注前端的东西,对后端了解较少。不过一直对Node.js比较感兴趣,去年12月还去参加了阿里的CNODE交流聚会。
 
以后希望通过这里的博客分享一些学习Node.js的笔记。一方面总结了自己的学习心得,另一方面也可以和大家一起分享交流。
 
嗯,大概就是这样子。
 
这篇就先介绍一个Node.js的模块——request。有了这个模块,http请求变的超简单。
 
 
使用超简单
 
Request使用超简单,同时支持https和重定向。
 
 
  1. var request = require('request'); 
  2. request('http://www.google.com', function (error, response, body) { 
  3.   if (!error && response.statusCode == 200) { 
  4.     console.log(body) // 打印google首页 
  5.   } 
  6. }) 
 
任何响应都可以输出到文件流。
 
 
  1. request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) 
反过来,也可以将文件传给PUT或POST请求。未提供header的情况下,会检测文件后缀名,在PUT请求中设置相应的content-type。
 
 
  1. fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) 
请求也可以pipe给自己。这种情况下会保留原content-type和content-length。
 
 
  1. request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) 
表单
 
request支持application/x-www-form-urlencoded和multipart/form-data实现表单上传。
 
x-www-form-urlencoded很简单:
 
 
  1. request.post('http://service.com/upload', {form:{key:'value'}}) 
或者:
 
 
  1. request.post('http://service.com/upload').form({key:'value'}) 
使用multipart/form-data不用操心设置header之类的琐事,request会帮你解决。
 
 
  1. var r = request.post('http://service.com/upload') 
  2. var form = r.form() 
  3. form.append('my_field', 'my_value') 
  4. form.append('my_buffer', new Buffer([1, 2, 3])) 
  5. form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')) 
  6. form.append('remote_file', request('http://google.com/doodle.png')) 
HTTP认证
 
 
  1. request.get('http://some.server.com/').auth('username', 'password', false); 
 
 
  1. request.get('http://some.server.com/', { 
  2.   'auth': { 
  3.     'user': 'username', 
  4.     'pass': 'password', 
  5.     'sendImmediately': false 
  6.   } 
  7. }); 
sendImmediately,默认为真,发送一个基本的认证header。设为false之后,收到401会重试(服务器的401响应必须包含WWW-Authenticate指定认证方法)。
 
sendImmediately为真时支持Digest认证。
 
OAuth登录
 
  1. // Twitter OAuth 
  2. var qs = require('querystring') 
  3.   , oauth = 
  4.     { callback: 'http://mysite.com/callback/' 
  5.     , consumer_key: CONSUMER_KEY 
  6.     , consumer_secret: CONSUMER_SECRET 
  7.     } 
  8.   , url = 'https://api.twitter.com/oauth/request_token' 
  9.   ; 
  10. request.post({url:url, oauth:oauth}, function (e, r, body) { 
  11.   // Ideally, you would take the body in the response 
  12.   // and construct a URL that a user clicks on (like a sign in button). 
  13.   // The verifier is only available in the response after a user has 
  14.   // verified with twitter that they are authorizing your app. 
  15.   var access_token = qs.parse(body) 
  16.     , oauth = 
  17.       { consumer_key: CONSUMER_KEY 
  18.       , consumer_secret: CONSUMER_SECRET 
  19.       , token: access_token.oauth_token 
  20.       , verifier: access_token.oauth_verifier 
  21.       } 
  22.     , url = 'https://api.twitter.com/oauth/access_token' 
  23.     ; 
  24.   request.post({url:url, oauth:oauth}, function (e, r, body) { 
  25.     var perm_token = qs.parse(body) 
  26.       , oauth = 
  27.         { consumer_key: CONSUMER_KEY 
  28.         , consumer_secret: CONSUMER_SECRET 
  29.         , token: perm_token.oauth_token 
  30.         , token_secret: perm_token.oauth_token_secret 
  31.         } 
  32.       , url = 'https://api.twitter.com/1/users/show.json?' 
  33.       , params = 
  34.         { screen_name: perm_token.screen_name 
  35.         , user_id: perm_token.user_id 
  36.         } 
  37.       ; 
  38.     url += qs.stringify(params) 
  39.     request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { 
  40.       console.log(user) 
  41.     }) 
  42.   }) 
  43. }) 
定制HTTP header
 
User-Agent之类可以在options对象中设置。在下面的例子中,我们调用github API找出某仓库的收藏数和派生数。我们使用了定制的User-Agent和https.
 
 
  1. var request = require('request'); 
  2.  
  3. var options = { 
  4.     url: 'https://api.github.com/repos/mikeal/request', 
  5.     headers: { 
  6.         'User-Agent': 'request' 
  7.     } 
  8. }; 
  9.  
  10. function callback(error, response, body) { 
  11.     if (!error && response.statusCode == 200) { 
  12.         var info = JSON.parse(body); 
  13.         console.log(info.stargazers_count + " Stars"); 
  14.         console.log(info.forks_count + " Forks"); 
  15.     } 
  16.  
  17. request(options, callback); 
cookies
 
默认情况下,cookies是禁用的。在defaults或options将jar设为true,使后续的请求都使用cookie.
 
 
  1. var requestrequest = request.defaults({jar: true}) 
  2. request('http://www.google.com', function () { 
  3.   request('http://images.google.com') 
  4. }) 
通过创建request.jar()的新实例,可以使用定制的cookie,而不是request全局的cookie jar。
 
 
  1. var j = request.jar() 
  2. var requestrequest = request.defaults({jar:j}) 
  3. request('http://www.google.com', function () { 
  4.   request('http://images.google.com') 
  5. }) 
或者
 
  1. var j = request.jar() 
  2. var cookie = request.cookie('your_cookie_here') 
  3. j.setCookie(cookie, uri, function (err, cookie){}) 
  4. request({url: 'http://www.google.com', jar: j}, function () { 
  5.   request('http://images.google.com') 
  6. }) 
注意,setCookie至少需要三个参数,最后一个是回调函数。

标签: Node.js
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告