Node第三方包 【Request】

文章目录

  • 🌟前言
  • 🌟Request
  • 🌟安装与使用
  • 🌟流(stream)操作
  • 🌟Form表单
    • 🌟application/x-www-form-urlencoded (URL编码的Form)
    • 🌟multipart/form-data (Multipart Form 上传)
  • 🌟HTTP认证
  • 🌟自定义HTTP头
  • 🌟OAuth签名
  • 🌟option所有可用参数
  • 🌟便捷方法
    • 🌟request.put
    • 🌟request.patch
    • 🌟request.post
    • 🌟request.head
    • 🌟request.del / request.delete
    • 🌟request.get
    • 🌟request.cookie
    • 🌟request.jar
  • 🌟写在最后

在这里插入图片描述

🌟前言

哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们带领大家初识一下 Node第三方包 Request ;让我们一起来看看吧🤘

🌟Request

Request => npm地址

HTTP请求客户端

后端开发经常会有使用http请求的情况,如:访问API或模拟web客户端请求等。业务不复杂的情况下,使用Nodejs的原生http模块的客户端功能可满足需求,但在业务较复杂时使用http模块工作量会比较大,使用第三方request模块会让http请求变的简单。request模块是一个HTTP客户端请求模块,使用非常简单,除支持一般http请求外,还可以更复杂的http请求,如:https请求、请示重定向、数据流转接、form表单提交、HTTP认证、OAuth登录、自定义HTTP header等。

名称地址
RequestGithub地址 https://github.com/request/request

🌟安装与使用

安装request模块:

npm install request

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

var request = require('request');
request('http://www.baidu.com', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // 请求到主页的HTML
  }
})

🌟流(stream)操作

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

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

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

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

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

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

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

与原生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'))

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

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

也可以使用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)
  }
})

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

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

🌟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){ /* ... */ })

🌟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);
});

🌟HTTP认证

在一些HTTP请求中,需要对请求对象进行身份验证。Request提供了多种身份验证方式:

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

当使用auth选项其可包含以下值:

  • user || username
  • pass || password
  • sendImmediately (可选)
  • bearer (可选)

而对于最终调用的auth(username, password, sendImmediately, bearer)方法来说,sendImmediately默认为true,这会导致一个 basic 或 bearer 认证头会被发送。如果sendImmediately设置为false,request会在收到401状态后尝试使用一个合适的认证头。

注意,也可以基于RFC 1738标准,在URL中添加认证信息。简单的是使用方式是在主机的@符号前添加user:password:

var username = 'username',
    url = 'http://' + username + ':' + password + '@some.server.com';

request({url: url}, function (error, response, body) {
   // Do more stuff with 'body' here
});

🌟自定义HTTP头

如果需要设置自定义的HTTP请求头,如:User-Agent,可以通过options对象设置。

var request = require('request');

var options = {
  url: 'https://api.github.com/repos/request/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);

🌟OAuth签名

Request支持OAuth 1.0。其默认使用的签名算法为 HMAC-SHA1:

// OAuth1.0 - 3-legged server side flow (Twitter example)
// step 1
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.

  // step 2
  var req_data = qs.parse(body)
  var uri = 'https://api.twitter.com/oauth/authenticate'
    + '?' + qs.stringify({oauth_token: req_data.oauth_token})
  // redirect the user to the authorize uri

  // step 3
  // after the user is redirected back to your server
  var auth_data = qs.parse(body)
    , oauth =
      { consumer_key: CONSUMER_KEY
      , consumer_secret: CONSUMER_SECRET
      , token: auth_data.oauth_token
      , token_secret: req_data.oauth_token_secret
      , verifier: auth_data.oauth_verifier
      }
    , url = 'https://api.twitter.com/oauth/access_token'
    ;
  request.post({url:url, oauth:oauth}, function (e, r, body) {
    // ready to make signed requests on behalf of the user
    var perm_data = qs.parse(body)
      , oauth =
        { consumer_key: CONSUMER_KEY
        , consumer_secret: CONSUMER_SECRET
        , token: perm_data.oauth_token
        , token_secret: perm_data.oauth_token_secret
        }
      , url = 'https://api.twitter.com/1.1/users/show.json'
      , qs =
        { screen_name: perm_data.screen_name
        , user_id: perm_data.user_id
        }
      ;
    request.get({url:url, oauth:oauth, qs:qs, json:true}, function (e, r, user) {
      console.log(user)
    })
  })
})

🌟option所有可用参数

request()的请求格式有如下两种形式:

request(options, callback);
// 或
request(url, options, callback);

当使用request.put()、request.post()等便捷方法进行请求时,同样有如下两种形式:

request.METHOD(options, callback);
// 或
request.METHOD(url, options, callback);

options表示请求选项,其中只有>url/uri是必须参数,其它都是可选值。下面是一些常用选项:

  • uri || url - 完整的uri字符串或可通过url.parse()解析的url对象
  • baseUrl - 用于基本uri的远整字符串。大多使用request.defaults,如:对于大多数请求你相使用相同的域名。如果baseUrl 是 https://example.com/api/,那么请求/end/point?test=true 会匹配到https://example.com/api/end/point?test=true;当baseUrl指定后,uri选项必须是字符串。
  • method - HTTP请求方法(默认: “GET”)
  • headers - HTTP请求头 (默认: {})

查询字符串相关选项:

  • qs - 包含查询字符串值的对象,会被添加到uri中
  • qsParseOptions - 用于qs.parse方法的选项对象,或者传入querystring.parse方法用于{sep:‘;’, eq:‘:’, options:{}}格式的对象
  • qsStringifyOptions - 用于qs.stringify 方法的选项对象,或者传入用于querystring.stringify 方法使用{sep:‘;’, eq:‘:’, options:{}}格式的选项。
  • useQuerystring - 如果true,使用querystring 来解析查询字符串,其它使用qs (默认: false)。设置为true时,你需要将数组序列化为foo=bar&foo=baz 而默认为 foo[0]=bar&foo[1]=baz

请求体相关选项:

  • body - 可用于:PATCH, POST 和 PUT 请求的请求体(发送的数据)。必须是Buffer, String 或 ReadStream。如果json 是 - true,则body 必须是一个JSON化的对象。
  • form - 当通过对象或查询字符串发送数据时,这一选项会设置body 为包含发送值的查询字符串,并添加自动Content-type: application/x-www-form-urlencoded请求头。
  • formData - 当发送multipart/form-data请求时使用。参见前面的Forms 一节。
  • multipart - 包含请求头与body属性的对象。会发送一个multipart/related请求。请求时使用。参见Forms。
    • 也可以传入一个{chunked: false, data: []},其 chunked 用于指定发送请求的 chunked 转换编码。如果非chunked请求,,不允许使用使用具有请求体流的数据项。
  • preambleCRLF - 在multipart/form-data请求之前添加一个 newline/CRLF 边界描述
  • postambleCRLF - 在multipart/form-data请求之后添加一个 newline/CRLF 边界描述
  • json - 设置 body(请求体) 为JSON格式,并添加Content-type: application/json请求头。另外,也会将响应体转换为JSON格式
  • jsonReviver - 一个reviver函数,会传递给JSON.parse() 方法用于解板响应体。
  • jsonReplacer - 一个 replacer 函数,会传递给JSON.stringify()方法用于序列化JSON请求体

认证相关选项:

  • auth - 包含 user || username, pass || password, 和 sendImmediately (可选)的哈希对象。
  • oauth - 用于 OAuth HMAC-SHA1 签名的选项
  • hawk - 用于Hawk 签名的选项。credentials 键必须包含必要的签名信息,参见hawk文档
  • aws - object 包含 AWS 签名信息。需要有key、secret属性,同样要有bucket选项,除非已在路径中指定bucket或请求不使用 - bucket (如 GET 服务)。如果要使用 AWS v4版本,则指定sign_version 选项值为 4,默认值为2。注意: 首先要 npm install aws4
  • httpSignature - 用于HTTP Signature Scheme的先项,使用Joyent’s签名库。keyId 和 key 属性必须同时指定

重定向相关选项:

  • followRedirect - 跟踪 HTTP 3xx 响应并重定向(默认: true)。这个属性也可以指定为一个获取单个- - - response的函数,如果重定向继续需要返回true 其它情况返回 false
  • followAllRedirects - 跟踪非GET请求的 HTTP 3xx 响应(默认: false)
  • maxRedirects - 最大重定向跟踪数量(默认: 10)
  • removeRefererHeader - 当发生重定向进移聊referer头(默认: false)。注意: 如果设为 true,referer头会设置为重定向链的初始请求。

编码/压缩相关选项:

  • encoding - 用于响应数据 setEncoding 头的编码。如果null,则 body 会返回一个 Buffer。任何情况下(除非设置为undefined) 都会将encoding 参数传递给 toString() 方法(默认为:utf8)。
  • gzip - 如果为 true,会添加一个Accept-Encoding 头用于发送到服务器的请求内容的压缩和解压从服务器返回的数据
  • jar - 如果 true,则记录使用的 cookies(或自定义 cookie jar)

代理相关选项:

  • agent - 用于http(s).Agent 的代理实例
  • agentClass - 或指定代理类
  • agentOptions - 并传入代理选项。注: 参见 HTTPS TLS/SSL API文档 和 代理一节
  • forever - 如果设置为 true 会使用 forever-agent
  • pool - 描述用于请求的代理的对象。如果此选项被省略,请求将使用全局代理(当允许时)。否则,请求将搜索您的自定义代理的池。如果没有找到自定义代理,将创建一个新的代理,并将其添加到池中。注意: pool 仅在指定agent选项后可用
    • maxSockets属性同样可用于pool对象,用于设置代理最大可创建的 sockets 连接数(如:pool: {maxSockets: Infinity})
    • 当发送 multiple 请求时,会创建一个新的pool 对象,maxSockets 将不会按预期工作。
  • timeout - 超时时间(毫秒)

本地代理选项:

  • localAddress - 用于连接网络连接的本地接口
  • proxy - 使用的HTTP代理。支持代理使用基本认证,即认证信息通过url参数发送
  • strictSSL - 如果设置为true,则需要有效的 SSL证书。注意: 要使用自己的证书管理,则需要指定一个所创建的代理的选项。
  • tunnel - 控制 HTTP CONNECT 连接的隧道,可为以下值:
    • undefined (默认) - true 表示目标为 https, false 为其它方式
    • true - 总是通过CONNECT隧道请求连接到目的 代理
    • false - 使用GET请求方法请求目标.
  • proxyHeaderWhiteList -发送到代理隧道的请求头白名单
  • proxyHeaderExclusiveList - 发送到代理隧道的请求头白名单,仅用于代理而不是目标服务器

HAR相关选项:

  • time - 为true时,则请求-响应环(包括所有重定向)在指定毫秒内提供,响应结果的回应时长为elapsedTime
  • har - HAR 1.2 请求对象 Object,将处理从HAR格式重写匹配值
  • callback - 或者通过选项对象传入请求回调函数。回调函数包含以下3个参灵敏:
    • error - 错误对象(出错时存在,通常由http.ClientRequest对象返回)
    • http.IncomingMessage对象
    • response 响应体(String、Buffer或JSON 对象)

🌟便捷方法

Request还可以使用以HTTP方法命名的便捷方法。

request.defaults(options)

返回一个正常请求API的包装器,其默认值为所传递的options选项。

示例:

// 使用 baseRequest() 进行请求是会设置一个 'x-token' 请求头
var baseRequest = request.defaults({
  headers: {'x-token': 'my-token'}
})

// 使用 specialRequest() 进行请求时,会包含一个在 baseRequest 中设置的 'x-token' 请求头
// 还会有一个 'special' 请求头
var specialRequest = baseRequest.defaults({
  headers: {special: 'special value'}
})

🌟request.put

与request()方法相同,但默认method: “PUT”

request.put(url)

🌟request.patch

与request()方法相同,但默认method: “PATCH”

request.patch(url)

🌟request.post

与request()方法相同,但默认method: “POST”

request.post(url)

🌟request.head

与request()方法相同,但默认method: “HEAD”

request.head(url)

🌟request.del / request.delete

与request()方法相同,但默认method: “DELETE”

request.del(url)
request.delete(url)

🌟request.get

与request()方法相同

request.get(url)

🌟request.cookie

创建一个新Cookie

request.cookie('key1=value1')

🌟request.jar

创建一个新Cookie Jar

request.jar()

注:Cookie Jar用于保存所访问网站的Cookie信息

🌟写在最后

更多Node知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15146.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

http协议(一)/应用层

学习目标:⭐理解应用层的作用,理解协议,理解序列化和反序列化,并且实现网络版计算器⭐HTTP协议。⭐手写一个简单的http协议。 应用层 我们写的一个个解决实际问题, 满足我们日常需求的网络程序, 都是在应用层。 协议/序列化与反…

ChatGPT原理剖析

文章目录 ChatGPT常见误解1. 罐头回应2. 网络搜寻重组 ChatGPT真正做的事——文字接龙ChatGPT背后的关键技术——预训练(Pre-train)一般机器是怎样学习的? ChatGPT带来的研究问题1. 如何精准提出需求2. 如何更改错误3. 侦测AI生成的物件4. 不…

十、v-model的基本使用

一、v-model的基本使用 表单提交是开发中非常常见的功能,也是和用户交互的重要手段: 比如用户在登录、注册时需要提交账号密码;比如用户在检索、创建、更新信息时,需要提交一些数据; 这些都要求我们可以在代码逻辑中…

系统分析师《企业信息化战略与实施》高频知识点

企业信息化战略与实施---企业信息化与电子商务 业务流程重组(Business Process Reengineering BPR)是针对企业业务流程的基本问题进行反思,并对它进行彻底的重新设计,使业绩取得显著性提高。与目标管理、全面质量管理、战略管理等…

输入捕获实验

实验内容 用TIM5 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间。 输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的…

快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)

一、介绍 😆 😁 😉 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需…

宝塔面板搭建自己的网站,并发布公网远程访问

文章目录 1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4.固定http地址5. 配置二级子域名6.创建一个测试页面 宝塔面板简单几步搭建本地web站点,并做内网穿透,实现公网用户也可以正常远程访问,无需公网IP,无需设置路由器。 1. 环…

Volatile系列(一):Volatile测试案例一可见性

系列文章 Volatile测试案例一可见性 目录 前言 测试1 逻辑 代码 结果 测试2 逻辑 代码 结果 结论 原理探讨(可见性) 前言 多线程是 JAVA 并发编程的主要应用,并发环境能大幅提高应用性能,提高 CPU 使用率&#xff0c…

优雅的接口防刷处理方案

前言 本文为描述通过Interceptor以及Redis实现接口访问防刷Demo 这里会通过逐步找问题,逐步去完善的形式展示 原理 通过ip地址uri拼接用以作为访问者访问接口区分 通过在Interceptor中拦截请求,从Redis中统计用户访问接口次数从而达到接口防刷目的 …

不应使用Excel进行项目资源规划的 7 个原因

项目资源规划早期仅限于基本分配和调度。因此,企业使用自制工具或excel表来执行这一简单功能。然而,随着技术和业务流程的发展,资源规划变得复杂,并包括其他组成部分,如预测和容量规划,优化等。 由于传统…

掌握好这几款TikTok数据分析工具,让你轻松提高曝光率!

为什么别人在TikTok发的普普通通的视频却有那么高的流量、几天内疯狂涨粉,而自己想破脑袋装饰自己的视频,结果却不如人意。 其实原因很简单,TikTok不像国内的抖音只面向中华民族,而是覆盖了150多个国家和75种语言用户&#xff0c…

【通信接口】UART、IIC、SPI

目录 一、预备知识 1、串行与并行 2、单工与双工 3、波特率 二、UART 三、IIC 四、SPI (一对一、一对多) 五、IIC、SPI异同点 参考文章:这些单片机接口,一定要熟悉:UART、I2C、SPI、TTL、RS232、RS422、RS485…

【Java EE初阶】计算机简介及多线程之创建线程

目录 1.计算机发展史 2.冯诺依曼体系 3.操作系统 操作系统的作用: 4.进程 1.PID(进程编号) 2.内存指针 应用程序申请到的内存中的首地址 3.文件描述符表 问:什么是并发?什么是并行? 4.进程的优先级&a…

卡尔曼滤波原理及代码

目录 一.简介 二.原理 1.先验估计原理 2.后验估计原理 3.总结 三.示例 一.简介 卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法,它可以在任意…

StarRocks 3.0 集群安装手册

本文介绍如何以二进制安装包方式手动部署最新版 StarRocks 3.0集群。 什么是 StarRocks StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,就可以…

同步辐射X射线断层扫描成像在各行业的应用

同步辐射X射线断层扫描成像在各行业的应用 同步辐射X射线断层扫描成像(synchrotron radiation X-ray computed tomography,SRCT)是一种非侵入式、高分辨率的成像技术,利用同步辐射光束产生的高强度、高亮度、单色性和相干性的X射线…

【面试】MySQL事务的12连问

文章目录 前言1. 什么是数据库事务?2. 事务的四大特性3. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?4. Mysql为什么选择RR作为默认隔离级别?5. 很多大厂为什么选择RC数据库隔离级别?6. 并发场景,数据…

Qt连接MySql数据库(本地和远程数据库均可)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 三种方法方法一 略方法二 使用ODBC设置mysql为数据源库1. 添加ODBC数据源,在控制面板中找到管理工具,其中有ODBC数据源 64位的,打…

数字孪生与元宇宙:数字化科技的双向融合之路

概念 (1)元宇宙(Metaverse)是一个虚拟的三维世界,由数字内容和物理世界中的现实空间相互交织而成,能够提供各种虚拟体验,例如虚拟现实、增强现实、虚拟社交、虚拟经济等。在元宇宙中&#xff0…

8种不同类型的防火墙

什么是防火墙? 防火墙是一种监视网络流量并检测潜在威胁的安全设备或程序,作为一道保护屏障,它只允许非威胁性流量进入,阻止危险流量进入。 防火墙是client-server模型中网络安全的基础之一,但它们容易受到以下方面的…