• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JavaScript > 详解node HTTP请求客户端 - Request

详解node HTTP请求客户端 - Request

作者:都市烟火 字体:[增加 减小] 来源:互联网 时间:2017-05-11

都市烟火通过本文主要向大家介绍了node invalid request,node http.request,node request,node.js request,node.js http.request等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Request是一个Node.jsNPM模块,它是一个HTTP客户端,使用简单功能确十分强大。我们可以用它来实现HTTP响应流的转接、模拟Form表单提交、支持HTTP认证、OAuth登录、自定义请求头等。下面我们来对这个模块做一个完整的介绍:

1. 安装及简单使用

安装request模块:

npm install request
</div>

Request设计为用最简单的方法发送HTTP请求,它还支持HTTPS请求和自动重定向跟踪:

var request = require('request');
request('http://www.baidu.com', function (error, response, body) {
 if (!error && response.statusCode == 200) {
 console.log(body) // IT笔录主页的HTML
 }
})
</div>

引用request模块后,就可以能通过request()方法来发送HTTP请求,在不指定请求选项option时,默认为GET。在上面请求中,对URLhttp://www.baidu.com

会301重定向到http://www.baidu.com。而Request会自动跟踪URL重定向请求,默认支持10次重定向跟踪。

2. 流(stream)操作

Node.js原生HTTP模块实现了对HTTP请求和响应对象的流操作,Request同样支持基于流的操作。

如,可以将任何响应流通过pipe转接到一个文件流:

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

同样,可以将一个读取的文件流转接到PUT或POST请求中。这个方法会自动检查文件扩展名,并设置一个与文件扩展名对应的content-type(当该请求头未设置时):

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

Request也支持pipe到它自己。这样操作时,content-type和content-length将被传递到其后的PUT请求中:

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

与原生HTTP客户端一样,Request在收到请求响应时会发送一个'response'。事件回调函数中会包含一个response参数,它是一个http.IncomingMessage实例:

request
 .get('http://google.com/img.png')
 .on('response', function(response) {
 console.log(response.statusCode) // 200
 console.log(response.headers['content-type']) // 'image/png'
 })
 .pipe(request.put('http://mysite.com/img.png'))
</div>

当请求发生错误时,可以简单的通过监听error事件来处理:

request
 .get('http://mysite.com/doodle.png')
 .on('error', function(err) {
 console.log(err)
 })
 .pipe(fs.createWriteStream('doodle.png'))
</div>

发挥一个想象:

http.createServer(function (req, resp) {
 if (req.url === '/doodle.png') {
 if (req.method === 'PUT') {
 req.pipe(request.put('http://mysite.com/doodle.png'))
 } else if (req.method === 'GET' || req.method === 'HEAD') {
 request.get('http://mysite.com/doodle.png').pipe(resp)
 }
 }
})
</div>

也可以使用pipe()方法将一个http.ServerRequest实例转换到一个http.ServerResponse。HTTP请求方法、请求头、请求体数据会被发送:

http.createServer(function (req, resp) {
 if (req.url === '/doodle.png') {
 var x = request('http://mysite.com/doodle.png')
 req.pipe(x)
 x.pipe(resp)
 }
})
</div>

通过pipe()返回的目标流,在Nodev0.5.x+版本中,可以写到一行:

req.pipe(request('http://mysite.com/doodle.png')).pipe(resp)
</div>

而所有这些,没有一个新功能会与原功能有冲突,只是对其进行了扩展。还可以使用HTTP代理,请求会被自动重定向并跟踪:

var r = request.defaults({'proxy':'http://localproxy.com'})

http.createServer(function (req, resp) {
 if (req.url === '/doodle.png') {
 r.get('http://google.com/doodle.png').pipe(resp)
 }
})
</div>

3. Form表单

request支付application/x-www-form-urlencoded 和 multipart/form-data 编码的form 上传。multipart/related会引用multipartAPI。

application/x-www-form-urlencoded (URL编码的Form)

URL编码的Form很简单:

request.post('http://service.com/upload', {form:{key:'value'}})
// or
request.post('http://service.com/upload').form({key:'value'})
// or
request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ })
</div>

multipart/form-data (Multipart Form 上传)

对于multipart/form-dataFrom文件上传,Request使用了form-data处理。大多数情况,可以通过formData选项添加上传文件:

var formData = {
 // 键-值对简单值
 my_field: 'my_value',
 // 使用 Buffers 添加数据
 my_buffer: new Buffer([1, 2, 3]),
 // 使用 Streams 添加数据
 my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
 // 通过数组添加 multiple 值
 attachments: [
 fs.createReadStream(__dirname + '/attachment1.jpg'),
 fs.createReadStream(__dirname + '/attachment2.jpg')
 ],
 // 添加可选的 meta-data 使用: {value: DATA, options: OPTIONS}
 // 对于一些流类型,需要提供手工添加 "file"-关联 
 // 详细查看 `form-data` : https://github.com/form-data/form-data
 custom_file: {
 value: fs.createReadStream('/dev/urandom'),
 options: {
 filename: 'topsecret.jpg',
 contentType: 'image/jpg'
 }
 }
};
request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) {
 if (err) {
 return console.error('upload failed:', err);
 }
 console.log('Upload successful! Server responded with:', body);
});

</div>

在一些更加高级的使用中,可以通过其自身的如r.form()来访问Form数据:

// NOTE: Advanced use-case, for normal use see 'formData' usage above
var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...})
var form = r.form();
form.append('my_field', 'my_value');
form.append('my_buffer', new Buffer([1, 2, 3]));
form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'});
</div>

multipart/related

在一些不同的HTTP实现中,需要在multipart/related的之前、之后或前后同时添加一个newline/CRLF(通过multipart选项)。特别是在.NET WebAPI 4.0中,需要将preambleCRLF设置为true:

request({
 method: 'PUT',
 preambleCRLF: true,
 postambleCRLF: true,
 uri: 'http://service.com/upload',
 multipart: [
 {
 'content-type': 'application/json',
 body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})
 },
 { body: 'I am an attachment' },
 { body: fs.createReadStream('image.png') }
 ],
 // alternatively pass an object containing additional options
 multipart: {
 chunked: false,
 data: [
 {
  'content-type': 'application/json',
  body: JSON.stringify({foo: 'bar', _attachment



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解node HTTP请求客户端 - Request
  • Node.js中的http请求客户端示例(request client)
  • Node.js获取前端ajax提交的request信息

相关文章

  • 2017-05-11Django1.7+JQuery+Ajax验证用户注册集成小例子
  • 2017-05-11Vue.js 2.0学习教程之从基础到组件详解
  • 2017-05-11jquery实现异步加载图片(懒加载图片一种方式)
  • 2017-10-15js DOM BOM基础操作
  • 2018-01-07ES6学习(1)块级作用域与函数作用域
  • 2017-05-11jQuery extend()详解及简单实例
  • 2017-05-11快速实现jQuery多级菜单效果
  • 2017-05-11微信小程序 radio单选框组件详解及实例代码
  • 2017-05-11js实现鼠标左右移动,图片也跟着移动效果
  • 2017-05-11利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • JAVA中截取字符串substring用法详解
    • jQuery为DOM动态追加事件的方法
    • JS字符串长度判断,超出进行自动截取的实例(支持中文)
    • jQuery编写textarea输入字数限制代码
    • JavaScript优化以及前段开发小技巧
    • DataTable自动添加序号
    • 关于call和apply函数
    • 微信小程序 欢迎页面的制作(源码下载)
    • jQuery插件jqGrid动态获取列和列字段的方法
    • div实现自适应高度的textarea实现angular双向绑定

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有