NodeJs通过HTTP模块发起GET|POST请求
【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】
Node.js 的 http 模块和 https 模块在使用差不多,只是换个名称,本文以 http 模块为例。http 的 get / post 等请求都是以 http.request()
方法进行的,所以搞懂该方法就搞懂了 Node.js 的 http 模块。
http.request()
方法有两种形参,区别在于是否添加 url 参数。
http.request(options[, callback])
http.request(url[, options][, callback])
url 可以是字符串或 URL 对象。 如果 url
是一个字符串,则会自动使用 url.URL() 解析它。 如果它是一个 URL 对象,则会自动转换为普通的 options 对象。
如果同时指定了 url 和 options,则对象会被合并,其中 options 属性优先。
官方文档:http://nodejs.cn/api/http.html#http_http_request_url_options_callback
POST
const http = require('http')
const querystring = require('querystring')
const zlib = require('zlib')
// 用于将对象转换成query字符串
const postData = querystring.stringify({
'msg': '你好世界',
'date': '2020-3-1'
});
console.log(`postData: ${postData}`)
const options = {
hostname: 'nodejs.cn',
port: 80,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
const request = http.request(options, (response) => {
if (response.headers['content-encoding'] === 'gzip') {
console.log('解决返回数据使用gzip进行压缩')
let gzip = zlib.createGunzip();
response.pipe(gzip);
response = gzip;
}
console.log(`状态码: ${response.statusCode}`);
console.log(`响应头: ${JSON.stringify(response.headers)}`);
response.setEncoding('utf8');
let body = ''
response.on('data', (chunk) => {
body+=chunk;
});
response.on('end', () => {
console.log(`响应主体: ${body}`);
});
});
request.on('error', (e) => {
console.error(`请求遇到问题: ${e.message}`);
});
// 将数据写入请求主体。
request.write(postData);
request.end();
GET
GET方法除了使用 http.request()
,还可以使用 http.get()
方法。
http.get(options[, callback])
http.get(url[, options][, callback])
由于大多数请求都是没有主体的 GET 请求,因此 Node.js 提供了这个便捷的方法。 这个方法与 http.request() 的唯一区别是它将方法设置为 GET 并自动调用 request.end()。
如果没有添加 response 事件处理函数,则响应将会被完全地丢弃。 如果添加了 response 事件处理函数,则必须消费完响应对象中的数据,消费方式包括:每当有 readable 事件时调用 response.read()
、添加 'data' 事件处理函数、通过调用 .resume()
方法。在消费完数据之前,不会触发 end 事件。 此外,在读取数据之前,它将会占用内存,这最终可能导致进程内存不足的错误。
与 request 对象不同,如果响应过早地关闭,则 response 对象不会触发 'error' 事件而是触发 'aborted' 事件。
const http = require('http')
const querystring = require('querystring')
const getData = querystring.stringify({
'time': '2019-03-22 14:54:55',
'page': 2
})
http.get(`http://nodejs.cn/?${getData}`, (response) => {
console.log(`状态码: ${response.statusCode}`);
console.log(`响应头: ${JSON.stringify(response.headers)}`);
if (response.statusCode!==200){
// 如果不想读取数据一定记得手动消费哦
response.resume();
return;
}
response.setEncoding('utf8');
let body = '';
response.on('data', (chunk) => {
body += chunk;
});
response.on('end', () => {
console.log(`响应主体: ${body}`);
});
}).on('error', (e) => {
console.error(`请求出现问题: ${e.message}`);
});
Options
【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】
options 对象包括如下属性:
agent
<http.Agent>| <boolean> 控制Agent
的行为。可能的值有:undefined
(默认): 对此主机和端口使用http.globalAgent
。Agent
对象: 显式地使用传入的Agent
。false
: 使用新建的具有默认值的Agent
。
auth
<string> 基本的身份验证,即'user:password'
,用于计算授权请求头。createConnection
<Function> 当agent
选项未被使用时,用来为请求生成套接字或流的函数。这可用于避免创建自定义的Agent
类以覆盖默认的createConnection
函数。详见agent.createConnection()
。任何双工流都是有效的返回值。defaultPort
<number> 协议的默认端口。 如果使用Agent
,则默认值为agent.defaultPort
,否则为undefined
。family
<number> 当解析host
或hostname
时使用的 IP 地址族。有效值为4
或6
。如果没有指定,则同时使用 IP v4 和 v6。headers
<object> 包含请求头的对象。host
<string> 请求发送至的服务器的域名或 IP 地址。默认值:'localhost'
。hostname
<string>host
的别名。为了支持url.parse()
,如果同时指定host
和hostname
,则使用hostname
。insecureHTTPParser
<boolean> 使用不安全的 HTTP 解析器,当为true
时接受无效的 HTTP 请求头。应避免使用不安全的解析器。有关更多信息,参阅--insecure-http-parser
。默认值:false
。localAddress
<string> 为网络连接绑定的本地接口。lookup
<Function> 自定义的查找函数。 默认值:dns.lookup()
。method
<string> 一个字符串,指定 HTTP 请求的方法。默认值:'GET'
。path
<string> 请求的路径。应包括查询字符串(如果有)。例如'/index.html?page=12'
。当请求的路径包含非法的字符时,则抛出异常。目前只有空格被拒绝,但未来可能会有所变化。默认值:'/'
。port
<number> 远程服务器的端口。默认值:defaultPort
(如果有设置)或80
。protocol
<string> 使用的协议。默认值:'http:'
。setHost
<boolean>: 指定是否自动添加Host
请求头。默认值:true
。socketPath
<string> Unix 域套接字。如果指定了host
或port
之一(它们指定了 TCP 套接字),则不能使用此选项。timeout
<number> : 指定套接字超时的数值,以毫秒为单位。这会在套接字被连接之前设置超时。
版权声明
【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】
NodeJs通过HTTP模块发起GET|POST请求的更多相关文章
- python内建模块发起HTTP(S)请求
一.Python2 httplib 简介:httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现. ...
- python 爬虫 urllib模块 发起post请求
urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...
- python 爬虫 基于requests模块发起ajax的post请求
基于requests模块发起ajax的post请求 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定某个城市地点的餐厅数据 点击肯德基餐厅查 ...
- python 爬虫 基于requests模块发起ajax的get请求
基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下 ...
- 关于Nodejs的多进程模块Cluster
关于Nodejs的多进程模块Cluster 前述 我们都知道nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的.Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并 ...
- Nodejs的http模块
一.http服务器 我们知道传统的HTTP服务器是由Aphche.Nginx.IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器,例如: ...
- 使用nodejs的http模块创建web服务器
使用nodejs的http模块创建web服务器 laiqun@msn.cn Contents 1. web服务器基础知识 2. Node.js的Web 服务器 3. 代码实现 1. web服务器基础知 ...
- node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
第七章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- nodeJS之crypto模块md5和Hmac加密
nodeJS之crypto模块md5和Hmac加密 原文地址:https://www.cnblogs.com/tugenhua0707/p/9128690.html 在nodejs中,可以使用cryp ...
随机推荐
- 安装superset遇到的坑
实验环境:ubuntu16.04 python环境: 3.6.7 安装参考:https://superset.incubator.apache.org/installation.html 特别提醒: ...
- 附件2:async/await
在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...
- 电子邮件协议及GO发送QQ邮件
目录 一.电子邮件的工作机制 1.1 SMTP 1.2 POP3 1.3 IMAP 二.邮件地址 三.MIME信息 四.使用golang发送qq邮件 一.电子邮件的工作机制 提供电子邮件服务的协议叫做 ...
- 怎样实现登录?| Cookie or JWT
先问小伙伴们一个问题,登录难吗?"登录有什么难得?输入用户名和密码,后台检索出来,校验一下不就行了."凡是这样回答的小伙伴,你明显就是产品思维,登录看似简单,用户名和密码,后台校验 ...
- 【Flutter组件终结篇】332个组件 658页PDF
老孟导读:历时1年的时间,整理完成了330+组件的详细用法,不仅包含UI组件,还包含了功能性的组件. 虽然整理了 330+的组件基本用法,但并不是让你每一个都学习一遍,任何技术基本都是掌握 20%就可 ...
- Java实现 LeetCode 488 祖玛游戏
488. 祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色,黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串 ...
- Java实现 LeetCode 352 将数据流变为多个不相交区间
352. 将数据流变为多个不相交区间 给定一个非负整数的数据流输入 a1,a2,-,an,-,将到目前为止看到的数字总结为不相交的区间列表. 例如,假设数据流中的整数为 1,3,7,2,6,-,每次的 ...
- Java实现 LeetCode 228 汇总区间
228. 汇总区间 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7] 输出: ["0->2","4-> ...
- ReentrantReadWriteLock(读写锁)全部源码注释
package java.util.concurrent.locks; import java.util.concurrent.TimeUnit; import java.util.Collectio ...
- 栈 & 队列
栈 先进者后出,后进者先出,LIFO,典型的"栈"结构 从栈的操作特性上来看,栈是一种"操作受限"的线性表,只允许在一段插入和删除数据. 在功能上来说,数组和链 ...