【本文版权归微信公众号"代码艺术"(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> 当解析 hosthostname 时使用的 IP 地址族。有效值为 46。如果没有指定,则同时使用 IP v4 和 v6。
  • headers <object> 包含请求头的对象。
  • host <string> 请求发送至的服务器的域名或 IP 地址。默认值: 'localhost'
  • hostname<string> host 的别名。为了支持 url.parse(),如果同时指定 hosthostname,则使用 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 域套接字。如果指定了 hostport 之一(它们指定了 TCP 套接字),则不能使用此选项。
  • timeout <number> : 指定套接字超时的数值,以毫秒为单位。这会在套接字被连接之前设置超时。

版权声明

【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

NodeJs通过HTTP模块发起GET|POST请求的更多相关文章

  1. python内建模块发起HTTP(S)请求

    一.Python2 httplib 简介:httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现. ...

  2. python 爬虫 urllib模块 发起post请求

    urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...

  3. python 爬虫 基于requests模块发起ajax的post请求

    基于requests模块发起ajax的post请求 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定某个城市地点的餐厅数据 点击肯德基餐厅查 ...

  4. python 爬虫 基于requests模块发起ajax的get请求

    基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下 ...

  5. 关于Nodejs的多进程模块Cluster

    关于Nodejs的多进程模块Cluster   前述 我们都知道nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的.Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并 ...

  6. Nodejs的http模块

    一.http服务器    我们知道传统的HTTP服务器是由Aphche.Nginx.IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器,例如: ...

  7. 使用nodejs的http模块创建web服务器

    使用nodejs的http模块创建web服务器 laiqun@msn.cn Contents 1. web服务器基础知识 2. Node.js的Web 服务器 3. 代码实现 1. web服务器基础知 ...

  8. node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)

    第七章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  9. nodeJS之crypto模块md5和Hmac加密

    nodeJS之crypto模块md5和Hmac加密 原文地址:https://www.cnblogs.com/tugenhua0707/p/9128690.html 在nodejs中,可以使用cryp ...

随机推荐

  1. 1.Redis介绍和使用场景

    (1)持久化数据库的缺点 平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常 ...

  2. 小谢第8问:ui框架的css样式如何更改

    目前有三种方法, 1.使用scss,增加样式覆盖,但是此种方法要求css的className需要与框架内的元素相一致,因此修改时候需要特别注意,一个父级的不同就可能修改失败 2.deep穿透,这种方法 ...

  3. js函数prototype属性学习(二)

    继续探讨js对象的prototype属性,前面已经看到在创建完一个对象之后,随时都会有一个_proto_属性伴随所有,那么,这个_proto_又是用来干嘛的,面试时问的高大上的原型链又是怎么回事? 拿 ...

  4. Attribute (XXX) is obsolete. Its use is discouraged in HTML5 documents.

    这种警告主要是因为这些属性在HTML5中过时了,并不影响代码运行,但是一些强迫症就会非常难受. 解决办法: 将程序的顶部的这句: !DOCTYPE 修改为: !DOCTYPE html PUBLIC ...

  5. Java实现 LeetCode 802 找到最终的安全状态 (DFS)

    802. 找到最终的安全状态 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后能走到终点,那么 ...

  6. Java实现 蓝桥杯 算法训练 Anagrams问题

    算法训练 Anagrams问题 时间限制:1.0s 内存限制:512.0MB 问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相 ...

  7. Java实现蓝桥杯VIP算法训练 石子游戏

    试题 算法训练 石子游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 石子游戏的规则如下: 地上有n堆石子,每次操作可选取两堆石子(石子个数分别为x和y)并将它们合并,操作的得分 ...

  8. 第四届蓝桥杯JavaC组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学. ...

  9. Java实现 蓝桥杯 历届试题 翻硬币

    问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...

  10. Java实现第九届蓝桥杯第几天

    第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. import java.util.Cal ...