Node.js-http模块

HTTP 协议

概念
  • HTTP(hypertext transport protocol)协议;中文叫超文本传输协议,是一种基于TCP/IP的应用层通信协议
  • 这个协议详细规定了 浏览器 和万维网 服务器 之间互相通信的规则。
  • 协议中主要规定了两个方面的内容
    • 客户端:用来向服务器发送数据,可以被称之为请求报文
    • 服务端:向客户端返回数据,可以被称之为响应报文
客户端请求规范(请求报文组成)
1. 请求行
  • 由三部分组成:
    • 请求方法
    • 常用的请求方法
    • GET:获取资源
    • POST:提交资源
    • PUT:更新资源
    • DELETE:删除资源
    • HEAD:获取资源的元信息
    • OPTIONS:获取服务器支持的请求方法
    • 请求URL​​:统一资源定位符
http://www.example.com:8080/path/to/resource?query=param#fragment
// 协议:http(https、ftp、ssh等) 通信协议
// 域名:www.example.com 服务器地址
// 端口:8080 端口号,默认端口号为80,可省略
// 路径:/path/to/resource 资源位置
// 查询参数:?query=param 用于向服务器传递额外信息
// 锚点:#fragment 页面内定位(浏览器端使用),哈希(锚点链接)
  • HTTP 协议版本
  • 例如:HTTP/1.1或HTTP/2
2.请求头
  • 采用键值对格式:头名: 头值
头名作用示例
Host目标主机Host: www.example.com
User-Agent客户端标识,用户代理,客户端字符串标识,服务器可以通过这个标识来识别这个请求来自User-Agent,哪个客户端 ,一般在PC端和手机端的区分User-Agent: Mozilla/5.0
Accept可接收的响应类型Accept: text/html
Accept-Encoding可接受的压缩编码类型Accept-Encoding: gzip, deflate
Cookie客户端存储信息Cookie: session_id=abc123
Content-Type请求体类型Content-Type: application/json
Authorization身份验证Authorization: Bearer token
Connection连接的设置 keep-alive(保持连接);close(关闭连接)Connection: keep-alive
Cache-Control缓存控制 max-age = 0 (没有缓存)Cache-Control: no-cache
Upgrade-Insecure-Requests将网页中的http请求转化为https请求(很少用)老网站升级Upgrade-Insecure-Requests: 1
Accept-Language可接受的语言Accept-Language: en-US,en;q=0.9
3.空行
  • 用于分隔请求头和请求体
4.请求体

包含客户端发送给服务器的数据:
​- ​GET请求​​:通常没有请求体

  • ​​POST/PUT请求​​:包含表单数据、JSON、文件等
  • 用于向服务器提交数据,例如表单数据、JSON数据等。
  • 请求体的格式取决于请求头中的Content-Type字段。
  • 常见的请求体格式有:
    • application/x-www-form-urlencoded:表单数据
    • multipart/form-data:文件上传
    • 表单:name=John&age=30
    • JSON:{“name”: “John”, “age”: 30}
    • XML:John
服务端响应规范(响应报文组成)
1.状态行(Status Line)
  • 由三部分组成:
    • HTTP协议版本
      • HTTP/1.1:HTTP协议版本号
    • 状态码(Status Code)
    //1xx  信息响应 ,请求已接收,继续处理
    //2xx  成功响应,请求成功处理
    //3xx  重定向,需要进一步操作
    //4xx  客户端错误,客户端请求错误
    //5xx  服务器错误,服务器处理错误
    //例如:
    //200 OK:请求成功
    //301 Moved Permanently:永久重定向
    //404 Not Found:资源不存在
    //500 Internal Server Error:服务器内部错误
    
    • 状态描述(Reason Phrase)
      • OK:请求成功
      • Not Found:请求的资源不存在
      • Internal Server Error:服务器内部错误
      • Bad Request:客户端请求错误
      • Unauthorized:未授权
      • Forbidden:禁止访问
  • 响应头
    服务器返回的元数据信息
常见的响应头作用示例
Content-Type响应体类型Content-Type: text/html;charset=utf-8,设置响应体的数据类型以及字符集,响应体为html,字符集utf-8
Content-Length响应体的长度,单位为字节Content-Length: 1234
Set-Cookie设置客户端CookieSet-Cookie: session_id=abc123
Cache-Control缓存控制Cache-Control: max-age=3600
Location重定向目标Location: /new-path
  • 空行
    分隔响应头和响应体的空行
  • 响应体
    服务器返回的实际内容
  • HTML页面
  • JSON/XML数据
  • 图片/视频等二进制文件
  • JavaScript/CSS等资源

MIME类型处理
HTTP通过Content-Type头指定数据的MIME类型

文件类型MIME类型说明
HTMLtext/html网页内容
CSStext/css样式表
JavaScriptapplication/javascript脚本
JSONapplication/json结构化数据
TEXTtext/plain文本
JPEGimage/jpeg图片
PDFapplication/pdf文档
XMLapplication/xmlXML数据
ZIPapplication/zip压缩文件
GIFimage/gifGIF图片
PNGimage/pngPNG图片
SVGimage/svg+xmlSVG图片
MP3audio/mpeg音频
MP4video/mp4视频

连接管理
HTTP协议支持不同的连接策略

  • ​HTTP/1.0​​:短连接(每次请求新建连接)
  • ​​HTTP/1.1​​:持久连接(默认启用Keep-Alive)
  • ​​HTTP/2​​:多路复用(多个请求共享一个连接)
  • ​​HTTP/3​​:QUIC协议(基于UDP的快速传输协议)
Node.js 创建 HTTP 服务

Node.js 内置的 http 模块可以轻松创建高性能的 HTTP 服务器

// 1.导入 http 模块
const http = require('http');//2. 创建服务对象 create 创建 server 服务
//request 意为请求. 是对请求报文的封装对象, 通过 request 对象可以获得请求报文的数据
//response 意为响应. 是对响应报文的封装对象, 通过 response 对象可以设置响应报文
const server = http.createServer((req, res) => {// 设置响应头//res.setHeader('Content-Type', 'text/plain');// 设置响应头防止中文乱码res.setHeader('content-type','text/html;charset=utf-8');// 发送响应res.end('哈哈哈Hello, World!\n');})
//3. 启动服务器监听指定端口
server.listen(3000, () => {console.log('服务启动成功, 端口号为 3000')  
})

注意:

  • 1.响应内容中文乱码的解决办法
// 设置响应头防止中文乱码
res.setHeader('content-type','text/html;charset=utf-8');
  • 2.端口号被占用
    解决办法:修改端口号
    在这里插入图片描述

  • 3.HTTP 协议默认端口是 80 。HTTPS 协议的默认端口是 443, HTTP 服务开发常用端口有 3000,
    8080,8090,9000 等

获取 HTTP 请求报文(请求对象 (request) 详解)

想要获取请求的数据,需要通过 request 对象

const server = http.createServer((req, res) => {// 1. 获取请求方法const method = req.method; // GET, POST 等// 2. 解析请求URLconst url = new URL(req.url, `http://${req.headers.host}`);
//   URL {
//   href: 'http://localhost:3000/?a=1',
//   origin: 'http://localhost:3000',
//   protocol: 'http:',
//   username: '',
//   password: '',
//   host: 'localhost:3000',
//   hostname: 'localhost',
//   port: '3000',
//   pathname: '/',
//   search: '?a=1',
//   searchParams: URLSearchParams { 'a' => '1' },
//   hash: ''
// } url1111// 3. 获取请求路径const pathname = url.pathname; // 如:'/api/user'// 4. 获取查询参数const query = Object.fromEntries(url.searchParams);// 5. 获取请求头const contentType = req.headers['content-type'];// 6. 获取请求体 (POST/PUT)let body = '';req.on('data', chunk => body += chunk);req.on('end', () => {console.log('请求体内容:', body);// 设置响应res.end(`请求方法: ${method}, 路径: ${pathname}`);});
});

注意:

  • request.headers 将请求信息转化成一个对象,并将属性名都转化成了『小写』
  • 关于路径:如果访问网站的时候,只填写了 IP 地址或者是域名信息,此时请求的路径为『 / 』
  • 关于 favicon.ico:这个请求是属于浏览器自动发送的请求
const http = require('http');
const server = http.createServer((req, res) => {// 获取请求方法和路径// const {method, url} = req;// console.log(req.url,'xxxxxxx') // /sm/api/user  http://localhost:3000/sm/api/user post// console.log(req.url,'xxxxxxx') // /  http://localhost:3000/ Get// console.log(req.url,'xxxxxxx') // /about  http://localhost:3000/about Getconst { method } = req;const url = new URL(req.url, `http://${req.headers.host}`);const pathname = url.pathname;// 设置响应头res.setHeader('Content-Type', 'text/html; charset=utf-8');// 路由处理if (method === 'GET' && pathname === '/') {res.end('<h1>首页</h1>');} else if (method === 'GET' && pathname === '/about') {res.end('<h1>关于我们</h1>');} else if (method === 'POST' && pathname === '/api/user') {// 处理API请求...res.end(JSON.stringify({ code: 200, data: { name: '苏木' } }));} else {res.statusCode = 404;res.end('<h1>页面不存在</h1>');}});server.listen(3000, () => {console.log('服务器已启动,监听端口 3000');});

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置 HTTP 响应报文(响应对象 (response) 详解)
const server = http.createServer((req, res) => {// 1. 设置状态码res.statusCode = 200; // 默认200,可以设置为404等// 2. 设置响应头res.setHeader('Content-Type', 'application/json');res.setHeader('Cache-Control', 'public, max-age=3600');// 3. 写入响应内容(多次写入)res.write('第一部分数据');res.write('第二部分数据');// 4. 结束响应并发送res.end('最后内容');// 5. 一次性写入并结束// res.end(JSON.stringify({ message: 'Hello' }));
});
静态文件服务

实现静态资源服务器

const http = require('http');
const fs = require('fs');
const path = require('path');// MIME 类型映射
const mimeTypes = {'.html': 'text/html','.js': 'text/javascript','.css': 'text/css','.json': 'application/json','.png': 'image/png','.jpg': 'image/jpeg','.gif': 'image/gif','.svg': 'image/svg+xml',
};const server = http.createServer((req, res) => {// 获取文件路径 public 文件夹下的文件的静态资源const filePath = path.join(__dirname, 'public', req.url);// 获取文件扩展名const extname = path.extname(filePath);// 设置默认内容类型let contentType = mimeTypes[extname] || 'application/octet-stream';// 读取文件fs.readFile(filePath, (err, data) => {if (err) {// 文件不存在if (err.code === 'ENOENT') {res.statusCode = 404;res.end('<h1>404 Not Found</h1>');} else {// 成功读取文件res.setHeader('Content-Type', contentType);res.end(data);}});
});server.listen(9000);// 访问: http://localhost:3000/232.png
// 结果如下

在这里插入图片描述

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

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

相关文章

Java JDBC的初步了解

文章目录 基本流程注册驱动的两种方法DriverManagerDriverManager 的核心作用核心原理自动注册驱动的机制关键方法 示例代码: 连接Mysql数据库StatementPreparedStatement JDBC全称Java DataBase Connectivity。 定义: JDBC 是 Java 语言中用于连接和执行 SQL 操作的标准接口。…

[netty5: ChunkedInput ChunkedWriteHandler]-源码分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按块读取不定长数据流的接口&#xff0c;常配合 ChunkedWriteHandler 实现流式写入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多种数据源。 实现类简要说明ChunkedFile用于将常规文件按块传输&#xff08;使用传统…

QT 第十二讲 --- 控件篇 LineEdit,TextEdit与ComboBox

前言&#xff1a;欢迎进入 QT 控件世界的第十二讲&#xff01;在上一讲《QT 第十一讲 --- 控件篇 LCDnumber&#xff0c;ProgressBar与CalenderWidget》中&#xff0c;我们探索了用于信息展示和状态反馈的控件&#xff1a;精准的数字显示器 LCD Number、直观的进度指示器 Progr…

VSCode遇到的一些小毛病(自动保存、运行后光标不再处于编辑区)

1. 右键点击Run Code没有触发自动保存 1. 打开 VS Code 设置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾选你需要的 2. 运行后光标仍然处于编辑区&#xff08;容易误输入&#xff09; 1. 打开 VS Code 设置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.单文件和项目&#xff08;多个 py 文件项目/模块化&#xff09;# 在编写代码时&#xff0c;一般两种模式&#xff0c;执行单个文件&#xff0c;或者执行一个完成项目&#xff08;包含多个 py 文件或者其它资源文件&#xff09;。 单文件模式&#xff1a;MaixVision 创建或者…

征信系统架构思想:打造商业信任基石_东方仙盟—仙盟创梦IDE

一、建设必要性在复杂的商业环境中&#xff0c;企业面临多元交易对象与业务场景&#xff0c;准确评估合作方信用状况及潜在价值的难度显著增加。传统经验判断和简单背景调查存在局限性&#xff0c;难以满足现代商业决策需求&#xff0c;因此构建科学的征信体系具有现实必要性。…

网安-XSS-pikachu

介绍 XSS&#xff0c;即跨站脚本攻击&#xff0c;是指攻击者利用Web服务器中的代码漏洞&#xff0c;在页面中嵌入客户端脚本&#xff08;通常是一段由JavaScript编写的恶意代码&#xff09;&#xff0c;当信任此Web服务器的用户访问 Web站点中含有恶意脚本代码的页面&#xff…

算法入门——字典树(C++实现详解)

字典树&#xff08;Trie&#xff09;是处理字符串匹配的高效数据结构&#xff0c;广泛应用于搜索提示、拼写检查等场景。本文将带你从零掌握字典树的原理与实现&#xff01; 一、什么是字典树&#xff1f; 字典树&#xff08;Trie&#xff09;是一种树形数据结构&#xff0c;…

SpringBoot整合SpringCache缓存

SpringBoot整合SpringCache使用缓存 文章目录SpringBoot整合SpringCache使用缓存1.介绍2.SpringBoot整合1.导入xml依赖2.配置yml3.使用EnableCaching启用SpringCache4.Cacheable5.CachePut6.CacheEvict7. Caching8.CacheConfig3.其他属性配置1.keyGenerator 属性2. cacheManage…

WPF学习笔记(20)Button与控件模板

Button与控件模板一、 Button默认控件模板详解二、自定义按钮模板一、 Button默认控件模板详解 WPF 中的大多数控件都有默认的控件模板。 这些模板定义了控件的默认外观和行为&#xff0c;包括控件的布局、背景、前景、边框、内容等。 官方文档&#xff1a;https://learn.mic…

蓝天居士自传(1)

蓝天居士何许人&#xff1f; 蓝天居士是我的笔名&#xff0c;也可以说是号。就好像李白号青莲居士、欧阳修号六一居士一样。笔者本名彭昊 —— 一个有不少重名重姓者的名字。 笔者小的时候上语文课&#xff0c;无论是小学、初中抑或是高中&#xff0c;都会有鲁迅&#xff08;…

短剧系统开发定制全流程解析:从需求分析到上线的专业指南

一、短剧行业数字化趋势与系统开发必要性在短视频内容爆发式增长的时代背景下&#xff0c;短剧作为一种新兴的内容形式正在迅速崛起。数据显示&#xff0c;2023年中国短剧市场规模已突破300亿元&#xff0c;用户规模达到4.5亿&#xff0c;年增长率超过200%。这一迅猛发展的市场…

getBoundingClientRect() 详解:精准获取元素位置和尺寸

getBoundingClientRect() 是 JavaScript 中一个强大的 DOM API&#xff0c;用于获取元素在视口中的精确位置和尺寸信息。它返回一个 DOMRect 对象&#xff0c;包含元素的坐标、宽度和高度等关键几何信息。 基本用法 const element document.getElementById(myElement); cons…

EXCEL 基础技巧

来源&#xff1a;WPS 官网 初步了解WPS表格-WPS学堂https://www.wps.cn/learning/course/detail/id/635.html 1、格式刷 1.1使用格式刷隔行填充颜色。 首先设置部分表格颜色&#xff0c;选中此区域&#xff0c;双击点击格式刷&#xff0c;然后选中其他表格区域。 这样就可以…

【RK3568 编译rtl8723DU驱动】

RK3568 编译rtl8723DU驱动 编译源码1.解压rtl8723du2.修改Makefile 验证1.加载模块2.开启wifi 在驱动开发中&#xff0c;驱动的编译与集成是实现设备功能的关键环节。本文聚焦于基于 RK3568 处理器平台编译 RTL8723DU WiFi/BT 二合一模块驱动的完整流程&#xff0c;涵盖源码编译…

基于Simulink的二关节机器人独立PD控制仿真

文章目录 理论模型仿真窗口控制函数目标函数仿真 本文是刘金琨. 机器人控制系统的设计与MATLAB仿真的学习笔记。 理论模型 对于二关节机器人系统&#xff0c;其动力学模型为 D ( q ) q C ( q , q ˙ ) q ˙ r D(q)\ddot qC(q,\dot q)\dot q r D(q)q​C(q,q˙​)q˙​r 式…

【技术架构解析】国产化双复旦微FPGA+飞腾D2000核心板架构

本文就一款基于飞腾D2000核心板与两片高性能FPGA的国产化开发主板进行技术解析&#xff0c;包括系统架构、主要硬件模块、关键接口及软件环境&#xff0c;重点阐述各子系统间的数据路径与协同工作方式&#xff0c;旨在为行业内同类产品设计与应用提供参考。 随着国产化要求的加…

Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?

目录1 示例代码2 欢迎纠错3 论文写作/Python 学习智能体1 示例代码 直接上代码。 def grpby1():xls "book.xls"df pd.DataFrame(pd.read_excel(xls, engine"xlrd"))print(df)"""序号 分类 销量0 1 文学 51 2 计算机…

【解决“此扩展可能损坏”】Edge浏览器(chrome系列通杀))扩展损坏?一招保留数据快速修复

引言 如果你想保留你的数据&#xff0c;敲重点&#xff1a;不要点击修复&#xff0c;不要修复&#xff0c;不要修复 在使用 Microsoft Edge 浏览器时&#xff0c;您可能会遇到扩展程序显示“此扩展程序可能已损坏”的提示&#xff0c;且启用按钮无法点击。这一问题让许多用户感…

AI专业化应用加速落地,安全治理挑战同步凸显

7月2日&#xff0c;2025全球数字经济大会在北京国家会议中心开幕。本届大会以“建设数字友好城市”为主题&#xff0c;聚焦数字技术对城市发展的影响。开幕式上&#xff0c;一首完全由AI生成的MV成为焦点——从歌词、谱曲、演唱到视频制作全流程AI生成&#xff0c;展现人工智能…