HTTP模块(一)

news2024/11/14 13:41:36

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: 17

Hello 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);
    // 获取请求的url
    console.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. 绑定end
    request.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.coloradmin.cn/o/1904457.html

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

相关文章

【TB作品】51单片机 Proteus仿真00016 乒乓球游戏机

课题任务 本课题任务 (联机乒乓球游戏)如下图所示: 同步显示 oo 8个LED ooooo oo ooooo 8个LED 单片机 单片机 按键 主机 从机 按键 设计题目:两机联机乒乓球游戏 图1课题任务示意图 具体说明: 共有两个单片机,每个单片机接8个LED和1 个按键,两个单片机使用串口连接。 (2)单片机…

【高阶数据结构】B-数、B+树、B*树的原理

文章目录 B树的概念及其特点解析B树的基本操作插入数据插入数据模拟 分析分裂如何维护平衡性分析B树的性能 B树和B*树B树B树的分裂B树的优势 B*B*树的分裂 总结 B树的概念及其特点 B树是一颗多叉的平衡搜索树&#xff0c;广泛应用于数据库和 文件系统中&#xff0c;以保持数据…

第2集《修习止观坐禅法要》

请打开补充讲表第一面&#xff0c;附表一、念佛摄心方便法。 我们前面讲到修止&#xff0c;就是善取所缘境的相貌&#xff0c;然后心于所缘&#xff0c;专一安住&#xff1b;心于所缘&#xff0c;相续安住&#xff1b;达到心一境性的目的。 站在修学净土的角度&#xff0c;他…

基于Python API的机械臂UDP上报设置及读取

睿尔曼机械臂提供了1个可持续读取机械臂状态的接口&#xff0c;UDP通信状态反馈接口。 该接口提供了json协议、API的读取&#xff0c;设置通信开启之后无需再进行设置即可以固定频率读取。 Python程序源码可从以下网盘地址获取&#xff08;地址永久有效&#xff09;&#xff1…

C# WinForm —— 38 SplitContainer介绍

1. 简介 将页面拆分成两个大小可以调整的区域&#xff0c;中间有一个拆分条&#xff0c;可以拖动拆分条来调整左右区域的大小 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到BoderStyle边框样式&#xff1a;None、FixedSingle、Fixed3DAutoScroll当控件…

PyFluent入门之旅(4)算例求解

在网格划分完成或已有网格的情况下&#xff0c;可以进行算例的求解。 1. 切换/打开求解器 一般启动求解器前有两种情况&#xff1a; 已启动FluentMeshing并生成了网格&#xff0c;需要在不退出FluentMeshing的情况下直接切换至Fluent求解器。已经有现成的网格文件&#xff0…

亚信安全发布2024年6月威胁态势,高危漏洞猛增60%

近日&#xff0c;亚信安全正式发布《2024年6月威胁态势报告》&#xff08;以下简称“报告”&#xff09;&#xff0c;报告显示&#xff0c;6月份新增信息安全漏洞 1794个&#xff0c;高危漏洞激增60%&#xff0c;涉及0day漏洞占67.67%&#xff1b;监测发现当前较活跃的勒索病毒…

Mysql 数据库主从复制-CSDN

查询两台虚拟机的IP 主虚拟机IP 从虚拟机IP服务 修改对应的配置文件 查询对应配置文件的命令 find / -name my.cnf编辑对应的配置文件 主 my.cnf &#xff08;部分配置&#xff09; [mysqld] ########basic settings######## server_id 1 log_bin /var/log/mysql/mysql-…

【大模型LLM面试合集】大语言模型基础_LLM为什么Decoder only架构

LLM为什么Decoder only架构 为什么现在的LLM都是Decoder only的架构&#xff1f; LLM 是 “Large Language Model” 的简写&#xff0c;目前一般指百亿参数以上的语言模型&#xff0c; 主要面向文本生成任务。跟小尺度模型&#xff08;10亿或以内量级&#xff09;的“百花齐放”…

聊一下Maven打包的问题(jar要发布)

文章目录 一、问题和现象二、解决方法&#xff08;1&#xff09;方法一、maven-jar-pluginmaven-dependency-plugin&#xff08;2&#xff09;方法二、maven-assembly-plugin 一、问题和现象 现在的开发一直都是用spring boot&#xff0c;突然有一天&#xff0c;要自己开发一个…

VSCode使用ipynb文件高效地进行功能测试

一、ipynb是什么文件 .ipynb文件是Jupyter Notebook的专用格式&#xff0c;它允许用户在一个网页应用中混合编写Markdown文本、执行代码、查看输出结果及图表。Jupyter Notebook的本质是一个Web应用程序&#xff0c;支持运行40多种编程语言&#xff0c;包括Python。它的主要用…

Linux基础: 二. Linux的目录和文件

文章目录 二. Linux的目录和文件1.1 目录概要1.2 目录详细说明 二. Linux的目录和文件 1.1 目录概要 command&#xff1a;ls / Linux的文件系统像一棵树一样&#xff0c;树干是根目录&#xff08;/&#xff09;&#xff0c;树枝是子目录&#xff0c;树叶是文件&#xff1b; …

阿里云存储的降本增效与运维

小浩负责公司存储架构层&#xff0c;需要确保存储层不会成为公司业务系统的性能瓶颈&#xff0c;让数据读写达到最佳性能。那么小浩可以从哪些方面着手优化性能呢&#xff1f;他继续求助系统架构师大雷。 小浩&#xff1a;雷哥&#xff0c;PD反馈公司系统最近响应很慢&#xff…

C++学习/复习21--多态定义/虚函数与重写/虚函数表/单继承多继承的多态/抽象类/面试题

一、多态的定义及条件 二、虚函数与重写 2.1virtual 注意事项&#xff1a;只有成员函数可以是虚函数 2.2三同与重写 2.3用基类的指针或引用 注意事项&#xff1a;指针指向什么对象就调用其相应的函数 2.4重写条件的例外 协变与重写 析构函数的重写 为什么析构函数需重写 2.5o…

桂花网蓝牙网关X1000:引领物联网新时代的智能连接

在物联网技术飞速发展的今天&#xff0c;蓝牙网关作为连接蓝牙设备与互联网的关键设备&#xff0c;其性能与稳定性直接影响到物联网系统的整体运行效果。桂花网蓝牙网关X1000凭借其卓越的性能和广泛的应用场景&#xff0c;成为了物联网领域的佼佼者。 一、产品概述 桂花网蓝牙…

【WPF】桌面程序开发之xaml页面基础布局方式详解

使用Visual Studio开发工具&#xff0c;我们可以编写在Windows系统上运行的桌面应用程序。其中&#xff0c;WPF&#xff08;Windows Presentation Foundation&#xff09;项目是一种常见的选择。然而&#xff0c;对于初学者来说&#xff0c;WPF项目中xaml页面的布局设计可能是一…

【刷题汇总--字符串中找出连续最长的数字串、岛屿数量、拼三角】

C日常刷题积累 今日刷题汇总 - day0071、字符串中找出连续最长的数字串1.1、题目1.2、思路1.3、程序实现 -- 比较1.4、程序实现 -- 双指针 2、岛屿数量2.1、题目2.2、思路2.3、程序实现 - dfs 3、拼三角3.1、题目3.2、思路3.3、程序实现 -- 蛮力法3.4、程序实现 -- 巧解(单调性…

制冷软件SOLKANE单级制冷循环计算

SOLKANE软件下载 单级制冷循环参数介绍 输入数据&#xff1a; 1.蒸发器&#xff1a; 温度&#xff1a;蒸发温度t6&#xff08;露点温度&#xff09;。 过热&#xff1a;制冷剂t6-t6在蒸发器中过热。 压力损失&#xff1a;蒸发器入口和出口之间的压力下降。 制冷量&#x…

Git管理源代码、git简介,工作区、暂存区和仓库区,git远程仓库github,创建远程仓库、配置SSH,克隆项目

学习目标 能够说出git的作用和管理源代码的特点能够如何创建git仓库并添加忽略文件能够使用add、commit、push、pull等命令实现源代码管理能够使用github远程仓库托管源代码能够说出代码冲突原因和解决办法能够说出 git 标签的作用能够使用使用git实现分支创建&#xff0c;合并…

linux-5.10.110内核源码分析 - Freescale ls1012a pcie msi中断

1、dts msi控制器描述 1.1、dts描述 msi: msi-controller11572000 {compatible "fsl,ls1012a-msi";reg <0x0 0x1572000 0x0 0x8>;msi-controller;interrupts <0 126 IRQ_TYPE_LEVEL_HIGH>; };ls1012a msi控制器具体介绍可以参考官网手册”25.1.1 PC…