详解nodejs http请求相关总结


Posted in NodeJs onMarch 31, 2019

nodejs http请求相关总结

通过node提供的http模块,可以通过其提供的get()和request()两个方法发起http请求,get()是对request()方法的封装,方便发起get请求,如果要实现post请求,那么需要对request()方法进行封装。

request()方法

let req = http.request("http://www.baidu.com", (res) =>{
 console.log(res.statusCode);
});
req.end();//必须调用end()方法结束请求

需要注意的是,使用request()方法发起http请求的时候,request()方法会返回一个请求对象,必须调用返回的请求对象的end()方法,表示请求动作已经完成,否则请求将会一直挂起,等待请求动作的完成。

request()方法参数问题:

request()的第一个参数可以直接是一个url地址,第二个参数为一个请求完成收到服务器响应后的回调函数,回调函数的参数只有一个即响应对象res

let req = http.request("http://www.baidu.com", (res) =>{
 console.log(res.statusCode);
});
req.end();//必须调用end()方法结束请求

request()的第一个参数可以是一个请求数据配置对象,第二个参数为一个请求完成收到服务器响应后的回调函数,回调函数的参数只有一个即响应对象res

let req = http.request({hostname:"www.baiduc.com",port:80}, (res) =>{
 console.log(res.statusCode);
});
req.end();//必须调用end()方法结束请求

需要注意的是,request()方法不能同时传递url地址和请求数据配置对象,只能二者选一个,也就是说request()方法只能传递两个参数

get()方法

let req = http.get("http://www.baidu.com", (res) =>{
 console.log(res.statusCode);
});

get()方法发起http请求的时候,get()方法也会返回一个请求对象,但是不用通过这个请求对象去调用end()方法,这一点和request()方法不同。

get()方法参数问题:

get()方法和request()方法的参数是一样的,就是不需要调用end()方法。

设置请求超时的方法

1. 要设置请求超时,可以通过get()或者request()方法返回的请求对象setTimeout()方法来实现。

let req = http.get("http://www.baidu.com", (res) =>{
 console.log(res.statusCode);
});
 req.setTimeout(1,()=>{
  console.log(`请求超时了`);
  req.abort();//终止请求
 });

1毫秒之后如果还没收到响应,那么就会触发setTimeout的回调函数,此时可以直接终止请求。

2. 也可以自己设立一个定时器来实现,如:

let requestTimer = null;
let req = http.get("http://www.baidu.com", (res) =>{
 console.log(res.statusCode);
 if(res.statusCode === 200){
  clearTimeout(requestTimer);//请求超时之前完成,清除超时定时器
 }
});

requestTimer = setTimeout(() => {
  req.emit("timeout", {"msg": "请求超时了"});//如果请求超时了则发送timeout事件
}, 1000);

req.on("timeout",(msg) => {//监听timeout事件并终止请求
 console.log(`收到timeout事件!`);
 req.abort();
 console.log(`终止请求`);
});

获取响应数据

get()和request()方法回调函数中的响应对象res中并不携带响应数据,如果要获取响应数据,那么需要通过响应对象去监听data和end事件来获取。

let req = http.get("http://www.baidu.com", (res) =>{
 let resStr = "";
 res.on("data", (res) => {
  resStr += res;
 }); 
 res.on("end", () => {
  console.log(resStr);
 });
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 #NodeJs
nodejs微信开发之自动回复的实现
Mar 17 #NodeJs
nodejs微信开发之接入指南
Mar 17 #NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 #NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 #NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 #NodeJs
NodeJs入门教程之定时器和队列
Mar 08 #NodeJs
You might like
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
收集的php编写大型网站问题集
2007/03/06 PHP
php 方便水印和缩略图的图形类
2009/05/21 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
JavaScript 数组运用实现代码
2010/04/13 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
详解javascript事件冒泡
2016/01/09 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
Python 获取div标签中的文字实例
2018/12/20 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
PHP数据运算类型都有哪些
2013/11/05 面试题
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
服装行业创业计划书范文
2014/02/05 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
小学生安全保证书
2015/05/09 职场文书
交通事故起诉书
2015/05/19 职场文书
开业庆典致辞
2015/08/01 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
《水上飞机》教学反思
2016/02/20 职场文书