Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
Node.js 的 http
模块是 Node.js 核心模块之一,它允许你创建 HTTP 服务器和客户端。以下是一些关键知识点和代码示例:
1. 创建 HTTP 服务器
使用 http.createServer()
方法可以创建一个新的 HTTP 服务器实例。这个方法接受一个回调函数,该函数在服务器接收到请求时被调用,参数为 req
(请求对象)和 res
(响应对象)。
const http = require('http');const server = http.createServer((req, res) => {res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello World
');
});server.listen(3000, () => {console.log(`服务器运行在 http://localhost:3000/`);
});
2. 响应方法
Node.js 的 http
模块提供了多种方法来响应 HTTP 请求。以下是 http.ServerResponse
对象的一些常用方法及其作用:
-
writeHead(statusCode, [reasonPhrase], [headers]):
-
作用:发送一个 HTTP 响应头到客户端。
statusCode
是状态码,reasonPhrase
是可选的状态短语(例如:“OK”),headers
是一个包含头部字段的对象。 -
示例:
res.writeHead(200, { 'Content-Type': 'text/plain' });
-
-
write(chunk, [encoding]):
-
作用:发送一个 HTTP 响应体的片段。
chunk
是要发送的数据块,encoding
是数据的编码,默认为'utf8'
。 -
示例:
res.write('Hello, '); res.write('World!', 'utf8');
-
-
end([data], [encoding]):
-
作用:发送 HTTP 响应体的最后一个片段,并关闭连接。如果提供了
data
,则会先发送这个数据。 -
示例:
res.end('This is the end of the response.');
-
-
setHeader(name, value):
-
作用:设置响应头字段
name
的值为value
。 -
示例:
res.setHeader('Content-Type', 'application/json');
-
-
getHeader(name):
-
作用:返回响应头字段
name
的值。 -
示例:
const contentType = res.getHeader('Content-Type');
-
-
removeHeader(name):
-
作用:移除响应头字段
name
。 -
示例:
res.removeHeader('Content-Type');
-
-
addTrailers(headers):
-
作用:添加 HTTP 尾部字段,这些字段在响应体之后发送。
-
示例:
res.addTrailers({ 'Content-MD5': '7895bf4e1c23b21b' });
-
-
flush():
-
作用:刷新响应体缓冲区,发送任何缓冲的数据到客户端。
-
示例:
res.flush();
-
-
finish():
-
作用:结束响应。如果响应体已经发送完毕,这个方法没有效果。如果响应体还在发送中,这个方法会发送剩余的数据。
-
示例:
res.finish();
-
-
setTimeout(msecs, callback):
* **作用**:设置响应的超时时间。如果响应在 `msecs` 毫秒内没有结束,那么响应将被自动结束。
* **示例**:res.setTimeout(3000, () => {console.log('Response timed out');});
- destroy(error):
* **作用**:销毁流,这将发送一个 RST 包到 TCP 层,立即关闭连接。
* **示例**:res.destroy(new Error('Something went wrong'));
这些方法提供了控制 HTTP 响应的灵活性,允许开发者根据需要发送不同类型的响应。在实际应用中,你可能会根据业务逻辑和客户端的需求来选择使用这些方法。
3. 请求方法
在Node.js中,http
模块提供了request
方法来发送客户端请求到服务器。以下是http.request
方法的一些常用方式:
-
基本请求
const http = require(‘http’);
const options = {
hostname: ‘www.example.com’,
port: 80,
path: ‘/path’,
method: ‘GET’
};const req = http.request(options, (res) => {
console.log(状态码: ${res.statusCode}
);res.on(‘data’, (chunk) => {
console.log(收到数据块: ${chunk}
);
});res.on(‘end’, () => {
console.log(‘响应结束’);
});
});req.on(‘error’, (e) => {
console.error(请求遇到问题: ${e.message}
);
});// 结束请求
req.end(); -
发送POST请求
const http = require(‘http’);
const querystring = require(‘querystring’);const postData = querystring.stringify({
key1: ‘value1’,
key2: ‘value2’
});const options = {
hostname: ‘www.example.com’,
port: 80,
path: ‘/path’,
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/x-www-form-urlencoded’,
‘Content-Length’: Buffer.byteLength(postData)
}
};const req = http.request(options, (res) => {
// 处理响应
});req.on(‘error’, (e) => {
// 处理请求错误
});req.write(postData);
req.end(); -
发送JSON数据
const http = require(‘http’);
const JSON.stringify;const data = {
key1: ‘value1’,
key2: ‘value2’
};const options = {
hostname: ‘www.example.com’,
port: 80,
path: ‘/path’,
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/json’,
‘Content-Length’: Buffer.byteLength(JSON.stringify(data))
}
};const req = http.request(options, (res) => {
// 处理响应
});req.on(‘error’, (e) => {
// 处理请求错误
});req.write(JSON.stringify(data));
req.end(); -
使用GET参数
const http = require(‘http’);
const querystring = require(‘querystring’);const params = {
key1: ‘value1’,
key2: ‘value2’
};const options = {
hostname: ‘www.example.com’,
port: 80,
path:/path?${querystring.stringify(params)}
,
method: ‘GET’
};const req = http.request(options, (res) => {
// 处理响应
});req.on(‘error’, (e) => {
// 处理请求错误
});req.end();
-
处理重定向
const http = require(‘http’);
let redirectCount = 0;
const options = {
hostname: ‘www.example.com’,
port: 80,
path: ‘/path’,
method: ‘GET’
};const req = http.request(options, (res) => {
if (res.statusCode === 301 || res.statusCode === 302) {
if (redirectCount < 10) {
redirectCount++;
const location = res.headers.location;
options.path = location;
const newReq = http.request(options, (res) => {
// 处理响应
});
newReq.end();
} else {
console.log(‘Too many redirects’);
}
} else {
// 处理响应
}
});req.on(‘error’, (e) => {
// 处理请求错误
});req.end();
这些示例展示了如何使用Node.js的http
模块发送不同类型的HTTP请求,包括基本的GET请求、POST请求、发送JSON数据、处理GET参数和自动处理重定向。
4. 处理 POST 请求
对于 POST 请求,你可以监听请求对象的 data
和 end
事件来处理请求体中的数据。
const http = require('http');
const server = http.createServer((req, res) => {if (req.method === 'POST' && req.url === '/submit') {let body = '';req.on('data', chunk => {body += chunk.toString();});req.on('end', () => {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end(`Received data: ${body}`);});} else {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('404 Not Found');}
});
server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});
5. Http状态码
在Node.js的http
模块中,设置响应头和状态码是通过http.ServerResponse
对象的方法writeHead
来完成的。以下是如何设置响应头和状态码的示例:
const http = require('http');const server = http.createServer((req, res) => {// 设置状态码为200(OK),并设置响应头res.writeHead(200, {'Content-Type': 'text/plain', // mime类型'Custom-Header': 'Custom Value'});// 发送响应体res.end('Hello, World!');
});server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});
状态码的类型
HTTP状态码分为几种类型,每种类型表示不同的响应类别:
-
1xx(信息性状态码):表示接收到的请求正在处理中。
100 Continue
:表明客户端可以继续发送请求体。101 Switching Protocols
:服务器根据客户端的请求切换到了不同的协议。
-
2xx(成功状态码):表示请求已成功被服务器接收、理解、并接受。
200 OK
:请求成功。201 Created
:请求成功,并且服务器创建了新的资源。202 Accepted
:请求已被接受,但未被执行。
-
3xx(重定向状态码):表示需要进一步操作才能完成请求。
301 Moved Permanently
:请求的资源已被永久移动到新位置。302 Found
:请求的资源临时移动到另一个URI。304 Not Modified
:如果请求的资源未修改,可以返回此状态码,无需再次发送资源内容。
-
4xx(客户端错误状态码):表示请求包含错误或无法被服务器理解。
400 Bad Request
:服务器无法理解请求,请求无效或格式错误。401 Unauthorized
:请求需要用户的身份认证。403 Forbidden
:服务器理解请求,但是拒绝执行。404 Not Found
:服务器找不到请求的资源。
-
5xx(服务器错误状态码):表示服务器在处理请求的过程中发生了错误。
500 Internal Server Error
:服务器遇到了一个预料之外的情况,导致无法完成请求。501 Not Implemented
:服务器不支持请求的功能,无法完成请求。503 Service Unavailable
:服务器目前无法处理请求,可能是过载或停机维护。
状态码是HTTP协议的核心部分,它们为客户端提供了请求处理结果的标准化信息。正确使用状态码可以帮助客户端更好地理解服务器响应的含义,并据此进行适当的操作。
6. MIME类型
MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)类型,也称为媒体类型,是一种标准,用于定义文件的格式和类型。在HTTP协议中,MIME类型用于告诉浏览器或接收端如何处理传输的数据。每个MIME类型由两部分组成:类型和子类型,中间用斜杠(/)分隔。
以下是一些常见的MIME类型及其描述:
-
Text-based MIME types:
text/html
:HTML文档。text/css
:层叠样式表(CSS)。text/javascript
:JavaScript代码。text/plain
:纯文本文件。text/xml
:XML文档。
-
Image MIME types:
image/gif
:GIF图片。image/jpeg
:JPEG图片。image/png
:PNG图片。image/svg+xml
:SVG矢量图。
-
Audio MIME types:
audio/mpeg
:MP3音频文件。audio/wav
:WAV音频文件。audio/ogg
:OGG音频文件。
-
Video MIME types:
video/mpeg
:MPEG视频文件。video/mp4
:MP4视频文件。video/ogg
:OGG视频文件。
-
Application MIME types:
application/json
:JSON数据。application/xml
:XML数据。application/pdf
:PDF文档。application/zip
:ZIP压缩文件。application/javascript
:JavaScript代码(通常用于外链脚本)。
-
Font MIME types:
font/ttf
:TrueType字体。font/otf
:OpenType字体。font/woff
:Web Open Font Format。font/woff2
:Web Open Font Format 2.0。
-
Other MIME types:
multipart/form-data
:用于表单数据的编码类型。binary/octet-stream
:任意的二进制数据。application/octet-stream
:用于二进制文件,如可执行文件或字节流。
MIME类型在HTTP响应的Content-Type
头字段中指定,告诉浏览器如何处理接收到的数据。同样,在发送HTTP请求时,Accept
请求头字段可以包含客户端能够处理的MIME类型列表,这允许服务器根据客户端的能力返回合适的数据格式。
7. 处理 JSON 数据
Node.js 的 http
模块可以处理 JSON 格式的数据,以下代码展示了如何返回 JSON 响应:
const http = require('http');
const server = http.createServer((req, res) => {const jsonResponse = {message: 'Hello, World!',status: 'success',};res.writeHead(200, { 'Content-Type': 'application/json' });res.end(JSON.stringify(jsonResponse));
});
server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});
这些是 Node.js http
模块的一些基本知识点和代码示例,可以帮助你开始使用 Node.js 进行 HTTP 通信。
相关文章:

Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
Node.js HTTP模块详解:创建服务器、响应请求与客户端请求 Node.js 的 http 模块是 Node.js 核心模块之一,它允许你创建 HTTP 服务器和客户端。以下是一些关键知识点和代码示例: 1. 创建 HTTP 服务器 使用 http.createServer() 方法可以创建…...

Day 17 卡玛笔记
这是基于代码随想录的每日打卡 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组…...

深圳大学-智能网络与计算-实验一:RFID原理与读写操作
实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法,步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一.软硬…...

⚡C++ 中 std::transform 函数深度解析:解锁容器元素转换的奥秘⚡【AI 润色】
在 C 编程的世界里,我们常常需要对容器中的元素进行各种转换操作。无论是将数据进行格式调整,还是对元素进行数学运算,高效的转换方法都是提升代码质量和效率的关键。std::transform函数作为 C 标准库<algorithm &g…...

【miniconda】:langraph的windows构建
langraph需要python3.11 langraph强烈建议使用py3.11 默认是3.12 官方 下载仓库 下载老版本的python (后续发现新版miniconda也能安装老版本的python) 在这里...

(k8s)k8s部署mysql与redis(无坑版)
0.准备工作 在开始之前,要确保我们的节点已经加入网络并且已经准备好,如果没有可以去看我前面发表的踩坑与解决的文章,希望能够帮到你。 1.k8s部署redis 1.1目标 由于我们的服务器资源较小,所以决定只部署一个redis副本&#x…...

Git常用操作指令
初始化配置 # 配置全局用户名和邮箱 git config --global user.name "账号" git config --global user.email "邮箱"# 查看配置信息 git config --list仓库初始化创建新的 Git 仓库: # 初始化新仓库 git init# 克隆远程仓库 git clone URL状态…...

新手理解:Android 中 Handler 和 Thread.sleep 的区别及应用场景
新手理解:Android 中 Handler 和 Thread.sleep 的区别及应用场景 Handler 是啥?Handler 的几个核心功能: Thread.sleep 是啥?Thread.sleep 的核心特点: 两者的区别它们的应用场景1. Handler 的应用场景2. Thread.sleep…...

智能安全策略-DPL
一、华三防火墙-接口的概念。 1、接口。 1. 什么是接口? 接口就像是防火墙的“门”,用来连接不同的网络设备,比如电脑、路由器、服务器等。通过这些“门”,数据(比如网页、视频、文件)才能进出防火墙。 …...

差分进化算法 (Differential Evolution) 算法详解及案例分析
差分进化算法 (Differential Evolution) 算法详解及案例分析 目录 差分进化算法 (Differential Evolution) 算法详解及案例分析1. 引言2. 差分进化算法 (DE) 算法原理2.1 基本概念2.2 算法步骤3. 差分进化算法的优势与局限性3.1 优势3.2 局限性4. 案例分析4.1 案例1: 单目标优化…...

Alibaba Spring Cloud 十七 Sentinel熔断降级
概述 在微服务架构中,熔断与降级是保证系统稳定性的重要机制,能有效防止故障蔓延或雪崩效应。当某个服务出现异常、延迟过高或错误率过高时,触发熔断保护,将该服务“隔离”一段时间,避免影响整体系统的吞吐和可用性。 …...

LetsWave脑电数据简单ERP分析matlab(一)
LetsWave是基于matlab的一款工具包,类似eeglab,也可以对数据进行预处理。习惯使用eeglab做数据预处理的,可以先在eeglab中做预处理,然后可以保存为*.set格式,最后在letswave中画图。 letswave下载地址:htt…...

设计模式Python版 工厂方法模式
文章目录 前言一、工厂方法模式二、工厂方法模式示例三、工厂方法模式客户端改进四、工厂方法模式隐藏工厂方法(可选) 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方…...

贝叶斯优化相关
贝叶斯优化相关 python中有很多模块支持贝叶斯优化,如bayesian-optimization、hyperopt,比较好用的是hyperopt,下面是对hyperopt文章的翻译,原文地址如下 https://districtdatalabs.silvrback.com/parameter-tuning-with-hyperop…...

【Matlab高端绘图SCI绘图全家桶更新版】在原60种绘图类型基础上更新
俗话说,一图胜千言。数据可视化便是将数据通过图形化的方式展现出来,它更加便于我们观察数据蕴含的的规律,洞察了数据蕴含的规律后,从而使我们能够做更好的进行科研表达和学术写作。 科研过程中,绘图是一项非常重要的…...

如何构建一个 GraphRAG 系统
构建一个 GraphRAG 系统以提升传统 RAG(检索增强生成)模型的性能,需要结合知识图谱和生成式语言模型的能力,以下是实现的关键步骤和方法: 1. 数据准备 (1) 收集数据 确保有足够的高质量文本数据源,如&…...

代码随想录算法训练营day34
代码随想录算法训练营 —day34 文章目录 代码随想录算法训练营前言一、62.不同路径动态规划动态规划空间优化 二、63. 不同路径 II动态规划动态规划优化空间版 三、343. 整数拆分动态规划贪心算法 96.不同的二叉搜索树总结 前言 今天是算法营的第34天,希望自己能够…...

单片机基础模块学习——按键
一、按键原理图 当把跳线帽J5放在右侧,属于独立按键模式(BTN模式),放在左侧为矩阵键盘模式(KBD模式) 整体结构是一端接地,一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…...

polars as pl
import polars as pl#和pandas类似,但是处理大型数据集有更好的性能. #necessary import pandas as pd#导入csv文件的库 import numpy as np#进行矩阵运算的库 #metric from sklearn.metrics import roc_auc_score#导入roc_auc曲线 #KFold是直接分成k折,StratifiedKFold还要考虑…...

重构(4)
(一)添加解释性变量,使得代码更容易理解,更容易调试,也可以方便功能复用 解释性的变量 总价格为商品总价(单价*数量)-折扣(超过100个以上的打9折)邮费(原价的…...
神经网络|(三)线性回归基础知识
【1】引言 前序学习进程中,已经对简单神经元的工作模式有所了解,这种二元分类的工作机制,进一步使用sigmoid()函数进行了平滑表达。相关学习链接为: 神经网络|(一)加权平均法,感知机和神经元-CSDN博客 神经网络|(二…...

deepseek R1 高效使用学习
直接提问 1、可以看到思考过程,可以当个学习工具 2、高效简介代码prompt <context> You are an expert programming AI assistant who prioritizes minimalist, efficient code. You plan before coding, write idiomatic solutions, seek clarification …...

STM32_SD卡的SDIO通信_基础读写
本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果,如下图: 一、SD卡 速读…...

【Docker】私有Docker仓库的搭建
一、准备工作 确保您的系统已安装Docker。如果没有安装,请参考Docker官方文档进行安装。 准备一个用于存储仓库数据的目录,例如/registry_data/。 二、拉取官方registry镜像 首先,我们需要从Docker Hub拉取官方的registry镜像。执行以下命…...

linux 管道符、重定向与环境变量
1. 输入输出重定向 在linux工作必须掌握的命令一文中,我们已经掌握了几乎所有基础常用的Linux命令,那么接下来的任务就是把多个命令适当的组合到一起,使其协同工作,会更高效的处理数据,做到这一点就必须搞清楚命令的输…...

Ansible fetch模块详解:轻松从远程主机抓取文件
在自动化运维的过程中,我们经常需要从远程主机下载文件到本地,以便进行分析或备份。Ansible的fetch模块正是为了满足这一需求而设计的,它可以帮助我们轻松地从远程主机获取文件,并将其保存到本地指定的位置。在这篇文章中…...

wireshark工具简介
目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…...

51单片机——按键控制LED流水灯
引言 在电子制作和嵌入式系统学习中,51 单片机是一个经典且入门级的选择。按键控制 LED 流水灯是 51 单片机的一个基础应用,通过这个实例,我们可以深入了解单片机的输入输出控制原理。 51 单片机简介 51 单片机是对所有兼容 Intel 8051 指…...

【opencv】第9章 直方图与匹配
第9章 直方图与匹配 9.1 图像直方图概述 直方图广泛运用于很多计算机视觉运用当中,通过标记帧与帧之间显著的边 缘和颜色的统计变化,来检测视频中场景的变化。在每个兴趣点设置一个有相近 特征的直方图所构成“标签”,用以确定图像中的兴趣点。边缘、色…...

HTML5 Web Worker 的使用与实践
引言 在现代 Web 开发中,用户体验是至关重要的。如果页面在执行复杂计算或处理大量数据时变得卡顿或无响应,用户很可能会流失。HTML5 引入了 Web Worker,它允许我们在后台运行 JavaScript 代码,从而避免阻塞主线程,保…...