HTTP模块(一)

HTTP服务

本小节主要讲解HTTP服务如何创建服务,查看HTTP请求&响应报文,还有注意事项说明,另外讲解本地环境&Node环境&浏览器之间的链路图示,如何提取HTTP报文字符串,及报错信息查询。

创建HTTP服务端

const http = require('http');const server = http.createServer((request, response) => {response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服务已启动');
});

浏览器输入http://127.0.0.1:9000/,可以看到node服务终端窗口打印日志:服务已启动。

查看报文

打开Fiddler,可以看到浏览器发送的请求报文和响应报文。

请求报文:

GET http://127.0.0.1:9000/favicon.ico HTTP/1.1
Host: 127.0.0.1:9000
Connection: keep-alive
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
sec-ch-ua-platform: "Windows"
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: image
Referer: http://127.0.0.1:9000/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9
(空格)

响应报文:

HTTP/1.1 200 OK
Date: Fri, 28 Jun 2024 06:07:06 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Content-Length: 17Hello Http Server
链路
本地环境 Node服务器 浏览器 const http = require('http') createServer((req, res) => res.end('Hello Http Server')) listen(9000, () => console.log('服务已启动')) GET / HTTP/1.1 HTTP/1.1 200 OK Hello Http Server 本地环境 Node服务器 浏览器
  1. 引入http模块:const http = require('http'); 这行代码引入了Node.js的内置http模块,该模块提供了创建HTTP服务器的功能
  2. 创建服务器:http.createServer() 方法用于创建一个HTTP服务器。它接受一个回调函数作为参数,该回调函数会在每次有请求到达服务器时被调用。回调函数有两个参数:requestresponse,分别代表请求对象和响应对象。
  3. 处理请求和响应:在这个例子中,当服务器接收到任何请求时,都会执行回调函数 (request, response) => { response.end('Hello Http Server'); }。这意味着无论你向服务器发送什么请求,它都会简单地结束响应,并向客户端发送字符串'Hello Http Server'作为响应体。
  4. 监听端口:server.listen(9000, () => { console.log('服务已启动'); }); 这段代码让服务器开始监听9000端口。一旦服务器成功启动并开始监听指定端口,就会在控制台打印出 ‘服务已启动’。这意味着你的HTTP服务器现在正在监听本机的9000端口,等待接收HTTP请求。
  5. 浏览器访问:通过在浏览器中输入 http://localhost:9000 来访问这个本地运行的Node.js服务器。浏览器会发送一个HTTP请求到这个地址,你的服务器会接收到这个请求,并返回'Hello Http Server' 的消息,这将在浏览器窗口中显示出来。

停止HTTP服务

当前命令行(终端)ctrl+C

更新HTTP服务

停止服务后,重新执行node脚本。(暂时)

注意事项

乱码

response不能返回中文,否则出现乱码,后续通过字符集处理。

const server = http.createServer((request, response) => {response.set('content-type', 'text/html;charset-utf-8');response.end('你好');
});
端口占用
Error: listen EADDRINUSE: address already in use :::9000
结束端口
  1. cmd netstat -aon|findstr "8080"
  2. 复制返回当前端口的pid进程号,比如是16712
  3. taskkill /pid 是16712 /f
  4. 终端打印成功:已终止PID为16712的进程
更改端口
server.listen(9001, () => {console.log('服务已启动');
});

默认端口

HTTP协议80是默认的端口,HTTP服务常用端口有3000,8080,900080端口的好处是简化访问过程,用户在浏览器中输入网址时无需指定端口号,因为浏览器默认使用80端口进行HTTP请求。还可以减少配置需求,无需额外配置端口映射或转发等。

请求行 & 请求头

const http = require('http');const server = http.createServer((request, response) => {// 获取请求方法console.log(request.method);// 获取请求的urlconsole.log(request.url);// 获取请求的版本号console.log(request.httpVersion);// 获取Http的请求头console.log(request.headers);response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服务已启动');
});

响应行

const http = require('http');const server = http.createServer((request, response) => {// 1. 申明let body = '';// 2. 绑定事件// 2.1 request本身就是可读流对象// 2.2 当请求体的数据到来时,会触发'data'事件。这里通过监听这个事件,将接收到的数据块chunk(Buffer类型)拼接到body字符串上。这是因为HTTP请求体可能分多个数据包到达,'data'事件可能触发多次,每次传递一部分数据。request.on('data', chunk => {body += chunk;});// 3. 绑定endrequest.on('end', () => {console.log('body', body);})response.end('Hello Http Server');
});
// 使用listen方法指定服务器监听的端口号(本例中为9000)
server.listen(9000, () => {console.log('服务已启动');
});

由于get请求body中是不带信息的,所以新建html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="http://127.0.0.1:9000" method="post"><input type="text" name="username"><input type="text" name="password"><input type="submit" value="提交"></form>
</body>
</html>

在这里插入图片描述
点击提交,控制台输出:
在这里插入图片描述
终端打印:

在这里插入图片描述

提取 http 报文字符串

url.parse 提取
const http = require('http');const url = require('url');const server = http.createServer((request, response) => {// 解析request.url// console.log('request', request.url);let res = url.parse(request.url, true);console.log('res', res);// 路径let pathName = res.pathName;// 查询字符串let keyword = res.query.keyword;response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服务已启动');
});
new URL 构造函数提取
const http = require('http');const server = http.createServer((request, response) => {let url = new URL(request.url, 'https://www.baidu.com');console.log('url', url);// 输出路径console.log('pathName', url.pathname);// 取出传参 这里以keyword为例console.log(url.searchParams.get('keyword'))response.end('Hello Http Server');
});server.listen(9000, () => {console.log('服务已启动');
});
new URL(input[, base])

new URL(input[, base]) 是一个 JavaScript 构造函数,用于从给定的输入字符串(input)创建一个新的 URL 对象。这个函数允许你以一种标准化的方式解析和操作网址。

  • input:这个参数是一个字符串,代表想要解析成URL对象的地址信息,它可以是绝对地址(如https://www.baidu.com/serach?keyword=1),也可以是相对网址(如path/to/page?keyword=1),如果提供的是相对地址,那么解析时就需要用到base参数。
  • base(可选参数):基准URL,当input是一个相对网址时,例如,如果 basehttps://www.example.com/,并且 inputpath/to/page,那么最终解析得到的完整 URL 就会是 https://www.example.com/path/to/page。如果 input 是一个绝对网址,那么 base 参数将被忽略,即使提供了也不会影响结果。

建议使用new URL,因为url.parse在Node.js v22.3.0版本被弃用了。

Node.js 中文网

常见报错信息:
错误代码说明
ERR_INVALID_PROTOCOL表示提供的URL协议部分无效或不受支持。
ERR_UNKNOWN_URL_SCHEME遇到了未知的URL方案(协议),即URL的开头部分没有被识别
ERR_INVALID_CHARURL中包含了无效的字符
ERR_FILE_NOT_FOUND尝试访问的文件不存在(在涉及文件系统操作时)
ERR_HTTP2_PROTOCOL_ERRORHTTP/2协议层面的错误
ERR_TLS_CERT_ALTNAME_INVALIDTLS证书的备用名称不匹配或无效
ERR_SSL_PROTOCOL_ERRORSSL/TLS握手过程中发生协议错误。
ERR_SOCKET_CLOSED套接字意外关闭,可能是因为网络问题或远程端点主动关闭连接
ERR_CONNECTION_REFUSED连接被目标主机拒绝,通常是由于目标端口无服务监听
ERR_CONNECTION_TIMED_OUT连接尝试超时,没有在预定时间内收到响应
ERR_ABORTED请求被用户或程序主动中断

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

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

相关文章

lspci

【原】Linux之PCIE三种空间解析 PCIe学习笔记——2.PCIe配置空间 PCIE学习&#xff08;2&#xff09;PCIE配置空间详解 开发者分享 | 使用 lspci 和 setpci 调试 PCIe 问题 b : 字节 w&#xff1a;word L&#xff1a; 4byte

LLM - 词表示和语言模型

一. 词的相似度表示 (1): 用一系列与该词相关的词来表示 (2): 把每个词表示一个独立的符号(one hot) (3): 利用该词上下文的词来表示该词 (3): 建立一个低维度的向量空间&#xff0c;用深度学习方法将该词映射到这个空间里(Word Embedding) 二&#xff1a;语言模型 (1): 根…

Postman中数据文件的高效使用:测试自动化与数据驱动测试实践

摘要 Postman 是一个强大的 API 开发工具&#xff0c;它不仅支持 API 的设计、开发和测试&#xff0c;还提供了数据驱动测试的功能。通过使用数据文件&#xff0c;我们可以模拟不同的测试场景&#xff0c;实现测试的自动化和重复执行。本文将详细介绍如何在 Postman 中使用数据…

PHP-实例-CSRF

1 需求 按照用途分类&#xff1a; 会话&#xff08;会话ID和会话令牌 二选一&#xff09; 会话ID&#xff1a;服务器侧自动生成&#xff0c;自动存储在cookie中&#xff0c;需要在服务器侧存储会话令牌&#xff1a;服务器侧手动生成&#xff0c;手动存储在cookie中&#xff0…

7月07日,每日信息差

第一、6 月份&#xff0c;北京、上海、广州和深圳的新建商品住宅成交量分别环比增加 21%、66%、48% 和 38%&#xff0c;均创年内新高 第二、2024 年世界人工智能大会上&#xff0c;上海向四家企业发放了首批无驾驶人智能网联汽车示范应用许可&#xff0c;这些企业可以在浦东部…

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

52-5 内网代理2 - LCX端口转发(不推荐使用LCX)

环境搭建: 本地开3台虚拟机:kali(必须)、windows2012与2008 (可换成其他windows虚拟机) kali - 网络配置成桥接模式 windows2012 - 设置两个网卡,NAT与桥接模式 注意:windows2012要关闭防火墙,要不然其他主机ping不通 关闭防火墙后再开启远程桌面连接 windwos20…

去O化神器 Exbase

随着去O化进程推动&#xff0c;很多旧业务依赖的oracle数据库&#xff0c;都需要实现做数据库的替换&#xff0c;当下能很好兼容Oracle&#xff0c;并实现异构数据库之间转换的工具并不多。这里给大家推荐一个商业工具数据库迁移工具exbase&#xff08;北京海量&#xff09;&am…

昇思MindSpore 25天学习打卡营|day18

DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动漫头像数据集共有70,171张动漫头像图片&#xff0c;图片大小均为96*96。 GAN基础原理 这部分原…

想知道你的电脑能不能和如何升级RAM吗?这里有你想要的一些提示

考虑给你的电脑增加更多的RAM,但不确定从哪里开始?本指南涵盖了有关升级Windows PC或笔记本电脑中RAM的所有信息。 你需要升级RAM吗 在深入研究升级RAM的过程之前,评估是否需要升级是至关重要的。你是否经历过系统滞后、频繁的BSOD错误或应用程序和程序突然崩溃?这些症状…

从零开始的python学习生活

pycharm部分好用快捷键 变量名的定义 与之前学习过的语言有所不同的是&#xff0c;python中变量名的定义更加的简洁 such as 整形。浮点型和字符串的定义 money50 haha13.14 gaga"hello"字符串的定义依然是需要加上引号&#xff0c;也不需要写&#xff1b;了 字符…

Django 常见的操作符

在filter() 方法&#xff0c;exclude() 方法中使用大于&#xff0c;小于&#xff0c;模糊匹配等操作符。 常见的操作符如下&#xff1a; 操作符含义示例等于Book.objects.filter(price10)! 或 __ne不等于用于查找字段不等于特定值的记录。但更常用exclude()方法。__gt大于用于…

React Redux使用@reduxjs/toolkit的hooks

关于redux的学习过程需要几个官网&#xff0c;有redux官网&#xff0c;React Redux官网和Redux Toolkit的官网。 其中后者的中文没有找到&#xff0c;不过其中的使用在React Redux官网的快速入门中有介绍。 现在一般不使用connect借接口了。 对于借助Redux Toolkit的React Redu…

Linux GUN(gcc/g++) 版本升级教程

Linux gcc/g 升级命令: // 查看当前安装的版本 ll /usr/bin/gcc* ll /usr/bin/g*// 更新源 sudo apt update // 安装新版本 sudo apt install g-10 gcc-10 // 应用新的版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-altern…

【网站推荐】Developer Roadmaps 开发者学习路线

你是否想学习某门技术而苦苦找不到学习路线。本文推荐一个网站&#xff0c;解决学习路径问题。 roadmap.sh 旨在创建路线图、指南和其他教育内容&#xff0c;以帮助指导开发人员选择路径并指导他们的学习。 技术路线包括了前端后端安卓iosUI设计等内容&#xff0c;一些技术比如…

信息安全三要素

文章目录 安全三要素 CIA机密性完整性可用性参考资料 安全三要素 CIA 安全三要素&#xff0c;也被称为信息安全的CIA三要素&#xff0c;是确保信息和系统安全的核心原则。它们分别是&#xff1a; 机密性&#xff08;Confidentiality&#xff09;&#xff1a;保护数据不能泄露…

antdesignvue对话框用户可移动并缩放

原贴 轻松搞定Ant Design Modal对话框拖拽缩放 - ByteZoneX社区https://www.bytezonex.com/archives/IFRuoJhd.html Ant Design 模态对话框&#xff1a;实现拖拽缩放功能 **子 Ant Design 是一个流行的前端 UI 框架&#xff0c;提供了一系列实用的组件&#xff0c;包括模态对…

ESP32CAM物联网教学02

ESP32CAM物联网教学02 物联网门锁 小智来到姑姑家门口&#xff0c;按了门铃&#xff1b;还在公司上班的姑姑用电脑给小智开了门&#xff0c;让他先进屋休息。小智对物联网门锁产生了兴趣&#xff1a;什么是物联网&#xff1f;为什么这么厉害&#xff1f; 初识物联网 我们在百…

andboxie-Plus - 知名沙盒软件、支持游戏多开测试软件

我们经常会需要用到一些毒瘤软件——它们可能不是真正的恶意软件&#xff0c;但总爱偷摸干一些流氓行为。 工作中&#xff0c;有时还不得不安装使用一些来路不明、不能完全信任的可疑软件。 装上吧&#xff0c;心里膈应、难受&#xff1b;不装吧&#xff0c;有些工作又进行不…

代码随想录算法训练营第五十八天|KMC101 孤岛的总面积、KMC102 沉没孤岛、KMC103 水流问题

题1&#xff1a; 指路&#xff1a;101. 孤岛的总面积 (kamacoder.com) 思路与代码&#xff1a; 本题要求找到不靠边的陆地面积&#xff0c;那么我们从地图的最外层开始遍历&#xff0c;找到靠近四个边的陆地&#xff0c;通过搜索将周边靠陆地且相邻的陆地1变成海洋0&#xf…