Node.js的http模块:创建HTTP服务器、客户端示例

新书速览|Vue.js+Node.js全栈开发实战-CSDN博客

《Vue.js+Node.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)

要使用http模块,只需要在文件中通过require('http')引入即可。http模块是Node.js原生模块中最为亮眼的模块。传统的HTPP服务器会由Apache、Nginx、IIS之类的软件来担任,但是Node.js并不需要。Node.js的http模块本身就可以构建服务器,而且性能非常可靠。

1.Node.js服务器端

下面创建一个简单的Node.js服务器。

【代码4-4】
01  const http = require('http');
02  const server = http.createServer(function(req, res) {
03      res.writeHead(200,{
04          'content-type': 'text/plain'
05      });
06      res.end('Hello, Node.js!');
07  });
08  server.listen(3000, function() {
09      console.log('listening port 3000');
10  });

【代码说明】

  1. 运行这段代码,在浏览器中打开http://localhost:3000/或者http://127.0.0.1:3000/,页面中显示“Hello,Node.js!”文字。

http.createServer()方法返回的是http模块封装的一个基于事件的HTTP服务器。同样地,http.request是其封装的一个HTTP客户端工具,可以用来向HTTP服务器发起请求。上面的req和res分别是http.IncomingMessage和 http.ServerResponse的实例。

http.Server的事件主要有:

  1. request:最常用的事件,当客户端请求到来时,该事件被触发,提供req和res两个参数,表示请求和响应信息。
  2. connection:当TCP连接建立时,该事件被触发,提供一个socket参数,是net.Socket的实例。
  3. close:当服务器关闭时,触发事件(注意,不是在用户断开连接时)。

http.createServer()方法其实就是添加了一个request事件监听,利用下面的代码同样可以实现【代码4-4】的效果。

【代码4-5】
01  const http = require('http');
02  const server = new http.Server();
03  server.on('request', function(req, res) {
04      res.writeHead(200,{
05          'content-type': 'text/plain'
06      });
07      res.end('Hello, Node.js!');
08  });
09  server.listen(3000, function() {
10      console.log('listening port 3000');
11  });

http.IncomingMessage是HTTP请求的信息,提供了以下3个事件:
    data:当请求体数据到来时该事件被触发。该事件提供一个chunk参数,表示接收的数据。
    end:当请求体数据传输完毕时,该事件被触发,此后不会再有数据。
    close:用户当前请求结束时,该事件被触发。
http.IncomingMessage提供的主要属性有:
    method:HTTP请求的方法,如GET。
    headers:HTTP请求头。
    url:请求路径。
    httpVersion:HTTP协议的版本。
将上面提到的知识融合到【代码4-4】的服务器代码中。

【代码4-6】
01  const http = require('http');
02  const server = http.createServer(function(req, res) {
03      let data  = '';
04      req.on('data', function(chunk) {
05          data += chunk;
06      });
07      req.on('end', function() {
08          let method = req.method;
09          let url = req.url;
10          let headers = JSON.stringify(req.headers);
11          let httpVersion = req.httpVersion;
12          res.writeHead(200,{
13              'content-type': 'text/html'
14          });
15          let dataHtml = '<p>data:' + data + '</p>';
16          let methodHtml = '<p>method:' + method + '</p>';
17          let urlHtml = '<p>url:' + url + '</p>';
18          let headersHtml = '<p>headers:' + headers + '</p>';
19          let httpVersionHtml = '<p>httpVersion:' + httpVersion + '</p>';
20  let resData=dataHtml + methodHtml + urlHtml + headersHtml + httpVersionHtml;
21          res.end(resData);
22      });
23  });
24  server.listen(3000, function() {
25      console.log('listening port 3000');
26  });

打开浏览器输入地址后,可以在浏览器页面中看到如图4.9所示的信息。

图4.9  浏览器效果

http.ServerResponse是返回给客户端的信息,其常用的方法为:

  1. res.writeHead(statusCode,[heasers]):向请求的客户端发送响应头。
  2. res.write(data,[encoding]):向请求发送内容。
  3. res.end([data],[encoding]):结束请求。

这些方法在上面的代码中已经演示过了,这里就不再演示了。

2.客户端向HTTP服务器发起请求

客户端向HTTP服务器发起请求的方法有:

  1. http.request(option[,callback]):option为json对象,主要字段有host、port(默认为80)、method(默认为GET)、path(请求的相对于根的路径,默认是“/”)、headers等。该方法返回一个httpClientRequest实例。
  2. http.get(option[,callback]):http.request()使用HTTP请求方式GET的简便方法。

同时运行【代码4-4】和【代码4-7】中的代码,可以发现命令行中输出“Hello, Node.js!”字样,表明一个简单的GET请求发送成功了。

【代码4-7】

01  const http = require('http');
02  let reqData = '';
03  http.request({
04      'host': '127.0.0.1',
05      'port': '3000',
06      'method': 'get'
07  }, function(res) {
08      res.on('data', function(chunk) {
09          reqData += chunk;
10      });
11      res.on('end', function() {
12          console.log(reqData);
13      });
14  }).end();

利用http.get()方法也可以实现同样的效果。

【代码4-8】
01  const http = require('http');
02  let reqData = '';
03  http.get({
04      'host': '127.0.0.1',
05      'port': '3000'
06  }, function(res) {
07      res.on('data', function(chunk) {
08          reqData += chunk;
09      });
10      res.on('end', function() {
11          console.log(reqData);
12      });
13  }).end();

与服务端一样,http.request()和http.get()方法返回的是一个http.ClientRequest()实例。http.ClientRequest()类主要的事件和方法有:

  1. response:当接收到响应时触发。
  2. request.write(chunk[,encoding][,callback]):发送请求数据。
  3. res.end([data][,encoding][,callback]):发送请求完毕,应该始终指定这个方法。

同样可以改写【代码4-8】为【代码4-9】。

【代码4-9】
01  const http = require('http');
02  let reqData = '';
03  let option= {
04      'host': '127.0.0.1',
05      'port': '3000'
06  };
07  const req = http.request(option);
08  req.on('response', function(res) {
09      res.on('data', function(chunk) {
10          reqData += chunk;
11      });
12      res.on('end', function() {
13          console.log(reqData);
14      });
15  });

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI赋能电商:构建高效、智能化的新零售生态

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;其在电商领域的应用日益广泛&#xff0c;从购物推荐到供应链管理&#xff0c;再到商品定价&#xff0c;AI正在全面改变传统电商的运营模式&#xff0c;并推动行业向智能化和精细化方向发展。本文将探讨如何利…

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…

openssl颁发包含主题替代名的证书–SAN

原文地址&#xff1a;openssl颁发包含主题替代名的证书–SAN – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 在 X.509 证书中&#xff0c;commonName&#xff08;CN&#xff09;字段只能有一个值。如果让证书支持多个域名和IP地址&#xff0c;…

从尾到头打印链表 剑指offer

题目描述 输入一个链表的头节点&#xff0c;从尾到头反过来打印出每个节点的值。 链表节点定义如下&#xff1a; struct ListNode {int m_nKey;ListNode*m_pNext; }; 代码实现 栈实现&#xff1a; 递归实现&#xff1a; 但是用递归实现可能存在的问题&#xff1a;

ajax基础

一&#xff1a;express框架 在终端输入nodejs文件名 // 引入express const express require(express); //创建应用对象 const app express(); //创建路由规则 app.get(/,(request,response) > {//设置响应response.send(Hello Express); }); // 监听3000端口 app.lis…

免费实用在线AI工具集合 - 加菲工具

免费在线工具-加菲工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/h…

UE5肉鸽游戏教程学习

学习地址推荐&#xff1a;UE5肉鸽项目实战教程_哔哩哔哩_bilibili

101页PDF | 德勤_XX集团信息化顶层规划设计信息化总体解决方案(限免下载)

一、前言 这份报告是一份关于集团信息化顶层规划设计的总体解决方案&#xff0c;旨在通过信息化转型提升集团管控和企业运营效率。报告回顾了项目的背景、目标和工作过程&#xff0c;分析了集团面临的内部和外部挑战&#xff0c;并提出了一系列解决方案&#xff0c;包括自上而…

L14.【LeetCode笔记】返回倒数第k个节点

目录 1.题目 2.分析 思路 代码 提交结果 1.题目 面试题 02.02. 返回倒数第 k 个节点 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 注意&#xff1a;本题相对原题稍作改动 示例&#xff1a; 输入&#xff1a; 1->2->3->4->5 和 …

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点&#xff0c;处于次要地位主要负责处理读操作的主机称为 follower 节点…

STM32端口模拟编码器输入

文章目录 前言一、正交编码器是什么&#xff1f;二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…

【Mybatis】@Param注解 resultMap手动映射

文章目录 一、映射文件参数二、查询映射2-1 一对一2-2 一对多2-3 总结 一、映射文件参数 Param 注解官方文档解释 1、单个参数&#xff08;对象&#xff09;不使用注解 public int save(User user);<!-- 添加用户 --> <insert id"save" parameterType&quo…

正则表达式灾难:重新认识“KISS原则”的意义

RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门&#xff0c;从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗&#xff1f; 把业务逻辑写入数据库&#xff0c;重新定义简单与效率。…

C#基础上机练习题

21.计算500-800区间内素数的个数cn&#xff0c;并按所求素数的值从大到小的顺序排列&#xff0c;再计算其间隔加、减之和&#xff0c;即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求&#xff0c;把结果cn和sum输出。 22.在三位整数…

【STM32】在 STM32 USB 设备库添加新的设备类

说实话&#xff0c;我非常想吐槽 STM32 的 USB device library&#xff0c;总感觉很混乱。 USB Device library architecture 根据架构图&#xff1a; Adding a custom class 如果你想添加新的设备类&#xff0c;必须修改的文件有 usbd_desc.cusbd_conf.cusb_device.c 需要…

多头数(head number);d_model、d_k;词嵌入维度之间的关系;多头是对不同维度的特征分开提取,意义在于将并行执行

目录 多头是对不同维度的特征分开提取,意义在于将并行执行 之后的每头提取的特征仅仅进行矩阵拼接 多头数(head number) d_model、d_k 词嵌入维度之间的关系 词嵌入的维度(d_model)决定了权重矩阵的形状 一、概念解释 二、关系举例说明 多头数,权重矩阵的长度和词…

Mac配置maven环境及在IDEA中配置Maven

Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具&#xff0c;它以项目对象模型&#xff08;POM&#xff09;为基础进行项目管理&#xff0c;通过POM文件来定义项目信息和依赖关系。同时&#xff0c;它也是构建自动化工具&#xff0…

Qt中2D绘制系统

目录 一、Qt绘制系统 1.1Qt绘制基本概念 1.2 绘制代码举例 1.3画家 1.3.1 QPainter的工作原理&#xff1a; 1.3.2 自定义绘制饼状图&#xff1a; 1.4画笔和画刷 1.4.1画笔 1.4.2 画刷填充样式 1.5 反走样和渐变 1.6绘制设备 1.7坐标变换 1.8QPainterPath 1.9绘制文…

运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快…

2022年计算机网络408考研真题解析

第一题&#xff1a; 解析&#xff1a;网络体系结构-数据链路层 在ISO网络参考模型中&#xff0c;运输层&#xff0c;网络层和数据链路层都实现了流量的控制功能&#xff0c;其中运输层实现的是端到端的流量控制&#xff0c;网络层实现的是整个网络的流量控制&#xff0c;数据链…