Nodejs之HTTP模块

news2024/11/24 21:47:24

目录

  • 前言
  • 一,创建HTTP模块
    • 1.1 基本使用
    • 1.2 注意事项
  • 二,查看报文
    • 2.1 浏览器查看HTTP报文
    • 2.2 利用request获取HTTP请求报文
      • 2.2.1 获取请求行和请求头
    • 2.2.2 获取请求路径
      • 2.2.3 获取查询字符串
  • 三,跟请求报文相关的练习
  • 四,设置响应报文
  • 五,HTTP响应练习
  • 六,网页资源
    • 6.1 网页资源加载的基本过程
    • 6.2 实现网页引入外部资源
    • 6.3 静态资源与动态资源
  • 后记

前言

学习本节内容要对客户端发送请求有一定了解,需要有nodejs的相关知识的基础。

如果这些知识掌握的不牢固,可以在我的专栏里面看到相关内容:
前后端交互知识储备
Nodejs

话不多说,开始学习。

一,创建HTTP模块

1.1 基本使用

HTTP是Nodejs的一个内置模块,不需要npm下载就可以直接使用,以下是基本的使用:

//导入httpmok 
const http = require('http');

//创建服务对象
const server = http.createServer((request, response) => {
    response.end('Hello HTTP Server');//设置响应体,结束响应
});

//监听端口,启动服务
server.listen(9000, () => {
    //服务启动成功
    console.log('服务已启动')
})

上面这个模块,要说的是,request和response。request封装了请求报文的相关内容,我们可以通过request看到客户端发送的请求内容;而response则是封装了响应报文的相关内容。

这里可以参考下我的这篇文章:
与前端相关的计网知识

继续说刚刚的代码,我们先在终端运行:
在这里插入图片描述
接着在本机回环地址的9000端口打开:
在这里插入图片描述

1.2 注意事项

1.命令行 ctrl + c 停止服务;

2.服务启动后,更新代码必须重启服务才能生效;

3.响应内容乱码解决:

response.setHeader('content-type', 'text/html;charset=utf-8');

二,查看报文

报文一共有两种,分为请求报文与响应报文。本节内容非常关键,教会读者如何通过浏览器、写代码来获取报文。

2.1 浏览器查看HTTP报文

运行后端代码,打开本地回环地址,f12打开终端,点开‘网络’:
在这里插入图片描述
点击请求:
在这里插入图片描述
右边就是相关内容。

但是现在我们看不到请求体,因为get请求的请求体绝大部分都是空的。所以我们现在写一个post:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <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="password" name="password">
        <input type="submit" value="提交">
    </form>
</body>
</html>

在这里插入图片描述

点击post后,会多出一个‘载荷’,里面是格式化后的请求体内容。
在这里插入图片描述
也可也点击上面的‘查看源代码’就可以看到原始的请求体内容了:
在这里插入图片描述

2.2 利用request获取HTTP请求报文

上一节讲解了报文的查看,事实上,在实际操作中,请求报文的获取更为重要,因为我们需要获取用户发起请求中的内容,然后给用户反应正确的响应结果。

2.2.1 获取请求行和请求头

通过request对象获取:

含义语法
请求方法request.method
请求路径request.url
URL路径request(‘url’).parse(request.url).pathname
URL查询字符串request(‘url’).parse(request.url,true).query
请求头request.headers
请求体request.on(‘end’, function(){})

几个注意事项:
1.request只能获取路径及查询字符串,无法获取URL中的域名和协议内容;

2.request.headers将请求信息转化为一个对象,且属性名都是小写;

3.关于路径,如果访问网站的时候,只填写了IP地址或者是域名信息,此时请求的路径为‘/';

4.关于favicon.ico:这个请求是属于浏览器自动发送的请求。

2.2.2 获取请求路径

这里介绍一个内置模块:url。

首先也是正常的导入流程:

//导入url模块
const url = require('url')

接着是路由和监听:

const server = http.createServer((request, response) => {
    //解析request.url这个内容
    let res = url.parse(request.url);//parse是url本身的一个方法,单词的意思是解析
    console.log(res)
    response.end('url')
})

server.listen(9000, () => {
    console.log('服务已启动')
})

我们用一个表单输入执行后,URL会被打印下来:
在这里插入图片描述
其中,pathname就是我们需要的地址。

2.2.3 获取查询字符串

在刚刚的基础之上,把parse后面加上一个’true’:
在这里插入图片描述
再次运行,下面会获取一些对象:
在这里插入图片描述
查询字符串:
在这里插入图片描述

三,跟请求报文相关的练习

需求:按照以下要求搭建HTTP服务:

请求类型请求地址响应体结果
get/login登录页面
get/reg注册页面

代码:

const http = require('http');

const server = http.createServer((request, response) => {
    //判断请求方法,url路径
    let {method} = request
    let {pathname} = new URL(request.url, 'http://127.0.0.1')
    console.log(method)
    console.log(pathname)
    response.setHeader('content-type', 'text/html;charset=utf-8');
    if(method == "GET" && pathname === '/login') {
        response.end('登录页面')
    }
    if(method == "GET" && pathname === '/reg') {
        response.end('注册页面')
    } else {
        response.end('404 Not Found')
    }
})

server.listen(9000, () => {
    console.log('服务已经启动')
})

四,设置响应报文

前面的内容我们了解了如何获取请求报文,在获取请求报文后我们需要给用户响应的反馈,所以本节,就是在告诉读者,如何设置响应报文。

作用语法
设置响应状态码response.statusCode
设置响应状态描述response.statusMessage(用的非常少)
设置响应头信息response.setHeader(‘头名’, ‘头值’)
设置响应体response.write(‘xx’) response.end(‘xxx’)

请求必须要有end。有且只有一次个。

五,HTTP响应练习

搭建HTTP服务,响应一个4行4列的表格:

const http = require('http')

const server = http.createServer((request, response) => {
    response.setHeader('content-type', 'text/html;charset=utf-8')
    response.end(`
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            td {
                padding: 20px 40px;
            }
            table, td {
                border-collapse: collapse;
            }
        </style>
    </head>
    <body>
        <table border="1">
            <tr><td><td/><td><td/></tr>
            <tr><td><td/><td><td/></tr>
            <tr><td><td/><td><td/></tr>
            <tr><td><td/><td><td/></tr>
        </table>
    </body>
    </html>
    `)
})

server.listen(9000, () => {
    console.log('服务已经启动')
})

在这些代码中,实际上是在js中写html、css、js。非常麻烦。如何去解决这一个问题?

优化版:把三件套写的内容给拿出来,然后直接放到end里面。

const http = require('http')
//导入fs模块
const fs = require('fs')

const server = http.createServer((request, response) => {
    response.setHeader('content-type', 'text/html;charset=utf-8')
    let html = fs.readFileSync(__dirname + './返回的表格.html')
    response.end(html)
})

server.listen(9000, () => {
    console.log('服务已经启动')
})

六,网页资源

6.1 网页资源加载的基本过程

不是一下子,一次加载,而是循序渐进的过程。

一般情况下,几次加载都是并行发送出去,等待结果回来。

6.2 实现网页引入外部资源

在第五节的案例中,我们通过fs读取文件,并把文件读取后,end出去了。

现在我们尝试,让index.html中的内容仅有html,样式和js都在index.html中导入:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./index.css">
</head>
<body>
    <div class="box">
        <h3>这个一个引外部资源的案例</h3>
        <h3>我现在一点都不快乐</h3>
        <h3>我感觉我的快乐就像是一条线,被抽离走了</h3>
        <button class="btn">点击按钮,还我快乐</button>
    </div>
    <script src="./index.js"></script>
</body>
</html>

如果直接进行如第五节一样的读取和end出去会出现的情况是:没有样式,也没有js。
在这里插入图片描述
样式是有了:
在这里插入图片描述
为何不生效?

点开css的请求一看:即使是css的请求,点开之后依旧是html:
在这里插入图片描述
js也是如此:
在这里插入图片描述
怎么解决:调整回调函数的代码。

根据内容,区分请求,也就是,根据请求头,来返回内容。

const fs = require('fs')
const http = require('http')

const server = http.createServer((request, response) => {
    //获取请求路径
    let {pathname} = new URL(request.url, 'http://127.0.0.1')
    if(pathname === '/') {
        const neirong = fs.readFileSync(__dirname + '/index.html')
        response.end(neirong)
    } else if(pathname === '/index.css') {
        const neirong = fs.readFileSync(__dirname + '/index.css')
        response.end(neirong)
    } else if(pathname === '/index.js') {
        const neirong = fs.readFileSync(__dirname + '/index.js')
        response.end(neirong)
    } else {
        response.statusCode = 404;
        response.end('404 not found')
    }

})

server.listen('9000', () => {
    console.log('服务器已启动')
})

最后就会有正常的结果了:
在这里插入图片描述
(请忽略我的emo,看了一下午nodejs是真的emo)

6.3 静态资源与动态资源

静态资源:内容长时间不发生改变的资源,例如图片、视频、css文件、js文件、html文件、字体文件等;

动态资源:内容经常更新的资源,例如百度首页、网易首页、京东搜索列表页等。

后记

以上就是htt模块的相关内容。欢迎关注!

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

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

相关文章

聊天机器人开发实战--(微信小程序+SpringCloud+Pytorch+Flask)【完整版】

文章目录 前言架构小程序端管理端运维端 交互聊天页面聊天发送流程历史聊天记录个人中心 总结 前言 没想到从五一之后&#xff0c;到现在鸽了那么久。没办法&#xff0c;实话实说&#xff0c;确实忙&#xff0c;五一期间就没怎么休息&#xff0c;开局第一周&#xff0c;准备IE…

Scala学习(七)---面向对象特质

文章目录 1.面向对象特质(Trait)2.特质声明2.1 特质的特点2.2 特质冲突2.3 特质叠加2.4 特质自身类型2.5 特质和抽象类的区别扩展 1.面向对象特质(Trait) 在Scala语言中&#xff0c;采用特质trait(特征)来代替接口的概念&#xff0c;也就是说&#xff0c;多个类具有相同的特质…

分享7款优质免费的Figma“中文插件”

今天我要向你们分享一些 Figma 的“中文插件”&#xff0c;这些插件不仅功能强大&#xff0c;而且免费使用&#xff0c;非常方便&#xff0c;而且是完全中文的页面使用起来非常便捷&#xff0c;可以大大提高设计师的效率和体验。 1、「平面 3D」 插件 首先是平面 3D 插件。该…

OpenVINO 2022.3之九:Post-training Optimization Tool (POT)

OpenVINO 2022.3之九&#xff1a;Post-training Optimization Tool (POT) Post-training Optimization Tool (POT) 通过在已训练好的模型上应用量化算法&#xff0c;将模型的权重和激活函数从 FP32/FP16 的值域映射到 INT8 的值域中&#xff0c;从而实现模型压缩&#xff0c;以…

驱动开发:内核实现进程汇编与反汇编

在笔者上一篇文章《驱动开发&#xff1a;内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作&#xff0c;本章将通过如上案例实现远程进程反汇编功能&#xff0c;此类功能也是ARK工具中最常见的功能之一&#xff0c;通常此类功能的实现分为两部分&#xff…

WXSS 模板样式

WXSS WXSS&#xff08;WeiXin Style Sheets&#xff09;是一套样式语言&#xff0c;用来美化 WXML 的组件样式&#xff0c;类似于网页开发中的 CSS WXSS 和 CSS 的关系 WXSS 具有 CSS 大部分特性&#xff0c;同时&#xff0c;WXSS 还对 CSS 进行了扩充以及修改&#xff0c;以…

AJ-Report是一个完全开源,拖拽编辑的可视化设计工具

简介 AJ-Report是全开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。     多数据源支持&#xff0c;内置mysql、elasticsearch、kudu驱动&#xff0c;支持自定义数据集省去数据接口开发&#xff0c;目前已支…

分布式应用之监控平台zabbix

1.监控系统的相关知识 1.1 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常&#xff0c;往往存在着很多的服务器、网络设备等硬件资源&#xff0c;如果我们想要能够更加方便的、集中的监控他们&#xff0c;zabix可以实现集中监控管理的应用程序 监控的初衷…

历届蓝桥杯青少年编程比赛 计算思维题真题解析【已更新3套 持续更新中】

一、计算思维组考试范围 计算思维组面向小学生&#xff08;7-12 岁&#xff0c;约 1-6 年级&#xff09;&#xff0c;通过设计多个角度的考核题目、层次科学的试卷组合、线上限时的考试形式&#xff0c;更加精确地考查学生的计算能力、反应能力、思维与分析能力&#xff0c;使…

【产品成长】产品专业化提升路径

产品专业化 产品专业化就是上山寻路。梳理一套作为产品经理的工作方法。 以图为例&#xff0c;做一个归纳。 第一&#xff1a;梳理自己的设计方法。就是拿到一个需求点之后&#xff0c;如何进行需求分析&#xff0c;如何还原业务情况&#xff0c;最终进行产品设计&#xff0c…

基于QEMU的RISC-V架构linux系统开发(三)——基于buildroot的最小根文件系统配置与编译

1.buildroot官网下载最新版本的buildroot。 https://buildroot.org/download.html 图1 下载最新版本的buildroot压缩包 2.拷贝buildroot软件包到工作目录&#xff0c;并解压buildroot。 图2 解压buildroot软件包 3.新建编译脚本build_risc-v.sh&#xff0c;使用buildroot自带的…

深度学习笔记之递归网络(五)递归神经网络的反向传播过程

机器学习笔记之递归网络——递归神经网络的反向传播过程 引言回顾&#xff1a;递归神经网络的前馈计算过程场景构建前馈计算描述 反向传播过程各参数的梯度计算各时刻损失函数梯度计算损失函数对各时刻神经元输出的梯度计算 Softmax \text{Softmax} Softmax回归的梯度计算关于 …

JAVA将xml数据转为实体类

使用 JAXB&#xff08;Java Architecture for XML Binding) 实现XML与Bean的相互转换 介绍 JAXB是一个业界的标准&#xff0c;是一项可以根据XML Schema产生Java类的技术。该过程中&#xff0c;JAXB也提供了将XML实例文档反向生成Java对象树的方法&#xff0c;并能将Java对象…

2023年7大人工智能技术趋势你有了解过嘛

人工智能 (AI) 已经接管世界&#xff0c;并且将在2023年继续向前发展。在2023年&#xff0c;它将完全实现自动化供应链、虚拟助手等多个产品与形态。 如今&#xff0c;世界正在经历一波人工智能驱动的全球经济转型浪潮。 当前之态势&#xff0c;人工智能 (AI) 技术几乎在每个领…

如何用Python进行屏幕录制?

文章目录 引言gpt3.5给出的代码更换截图函数——ImageGrab.grab禁用imshow解决递归现象摄像头录制代码后期需求 引言 关于屏幕录制这个功能需求&#xff0c;之前用过基于ffmpeg的Capture录屏软件&#xff0c;但是fps拉高以后会变得很卡&#xff0c;声音也同样出现卡顿。也自己…

cpu 内核 逻辑处理器的关系

6核CPU&#xff0c;12个逻辑处理器 一颗内核在一个时间片内只能执行一个内核线程&#xff1b;当物理CPU使用了超线程技术后&#xff0c;在CPU的一颗内核中&#xff0c;利用就是利用其中空闲的执行单元&#xff0c;模拟出另外一个核心&#xff08;并不是真正的物理运算核心&…

公司招人,面了一个5年经验不会自动化的测试人,他凭什么要18K?

在深圳这家金融公司也待了几年&#xff0c;被别人面试过也面试过别人&#xff0c;大大小小的事情也见识不少&#xff0c;今天又是团面的一天&#xff0c; 一百多个人都聚集在一起&#xff0c;因为公司最近在谈项目出来面试就2个人&#xff0c;无奈又被叫到面试房间。 整个过程…

【算法训练(day5)】前缀和与差分

目录 一.一维前缀 二.二维前缀和 三.一维差分 四.二维差分 一.一维前缀 1.前缀的作用 前缀用于在求一部分区间的和&#xff0c;比方说有一组数据a1,a2,a3,a4,我们想知道从第一个元素一直相加到最后一个元素的和或者是从第二个元素加到第三个元素&#xff0c;这种情况下就能…

docker部署elasticsearch:8.6.2, kibana,logstash 版本以及kibana的使用

文章目录 1、参考2、安装elasticsearch:8.6.22.1 创建网络2.2 创建无密码访问的elasticsearch服务2.3 访问验证2.4 建一个索引试试&#xff0c;此索引名为my-book&#xff0c;有六个字段2.5 用GET命令获取索引信息试试&#xff0c;如下&#xff0c;符合预期2.6 再试试批量导入一…