HTTP、模块化

HTTP协议

包括请求行、请求头、请求体
http常见请求方法:
在这里插入图片描述
url统一资源请求符,其本身也是一个字符串
在这里插入图片描述
响应体的内容格式是非常灵活的,常见的响应体格式有:
1.HTML 2.CSS 3. JavaScript 4.图片 5.视频 6.JSON
响应状态码:
在这里插入图片描述
在这里插入图片描述

IP本身是一个数字标识IP 用来标志网络设备,实现设备间通信
在这里插入图片描述
端口:应用程序的数字标识
作用:实现不同主机应用程序之间的通信
响应报文包含响应行,响应头,响应体

HTTP服务注意事项

在这里插入图片描述
https默认端口号是443

创建http服务

// 导入http模块
const http=require('http');
// 创建服务对象
// 请求  响应
const server=http.createServer((request,response)=>{response.setHeader('content-type','text/html;charset=utf-8');//设置响应头response.end('Hello HTTP Server');//设置响应体
})
// 3.监听端口,启动服务
server.listen(9000,()=>{console.log('服务已经启动。。。');
})

获取http请求报文

在这里插入图片描述

//1. 导入http模块
const http=require('http');
//2.创建服务对象
// 请求  响应
const server=http.createServer((request,response)=>{// 1.声明一个变量let body='';// 2.绑定事件request.on('data',chunk=>{body+=chunk;//chunk是buffer,在做加法的时候会转化为字符串})// 3.绑定end事件request.on('end',()=>{console.log(body);response.end("Hello http");})
})
// 3.监听端口,启动服务
server.listen(9000,()=>{console.log('服务已经启动。。。');
})

提取HTTP请求报文

查找路径和字符串的两种方式

const http=require('http');
// 1.导入url模块
const url=require('url');
const server=http.createServer((request,response)=>{// 2.解析request.urllet res=url.parse(request.url,true);//第二个属性为true时quire属性将会变成一个对象// 路径let pathname=res.pathname;console.log(pathname);// 查询字符串let keyword=res.query.keyword;console.log(keyword);response.end('url');
})
server.listen(9000,()=>{console.log('服务已经启动。。。');
})
const http=require('http');
const server=http.createServer((request,response)=>{// 实例化url对象// let url=new URL('http://www.xxx.com/search?a=100&b=200')// let url=new URL('/search?a=100&b=200','http://127.0.0.1');let url=new URL(request.url,'http://127.0.0.1');// 输出路径console.log(url.pathname);// 输出keyword查询字符串console.log(url.searchParams.get('keyword'));response.end('url new');
})
server.listen(9000,()=>{console.log('服务已经启动。。。');
})

响应请求练习

在这里插入图片描述

const { log } = require('console');
const http=require('http');
const server=http.createServer((request,response)=>{// 获取请求的方法// let method=request.method;let {method}=request;// 获取请求的url路径let {pathname}=new URL(request.url,'http://127.0.0.1');response.setHeader('content-type','text/html;charset=utf-8');// 判断if(method==='GET' && pathname==='/reg'){response.end('注册界面');}else if(method==='GET' && pathname==='/login'){response.end('登陆界面');}else{response.end('404 Not Found');}// response.end('practice');
});
server.listen(9000,()=>{console.log('服务器已经启动。');
})

设置HTTP的响应报文

在这里插入图片描述
write可以多次调用
每一个请求,在处理的时候必须要执行end 方法的,有且只能有一个end方法

write和end 的两种使用情况:
//1.write和end 的结合使用响应体相对分散
response.write('xx');
response.write('xx');
response.write('xx');
response.end();//每一个请求,在处理的时候必须要执行end 方法的
//2.单独使用end 方法响应体相对集中
response.end('xxx');

练习:列表隔行换色

搭建HTTP服务,响应一个4行3列的表格,并且要求表格有隔行换色效果,且点击单元格能高亮显示

const http=require('http');
//引入fs模块
const fs=require('fs');
const server=http.createServer((request,response)=>{// 读取文件内容let html=fs.readFileSync(__dirname+'./test.html')response.end(html);//end()参数可以是Buffer和字符串
})
server.listen(9000,()=>{console.log('服务已经启动');
})

网页资源加载基本过程

网页资源的加载都是循序渐进的,首先获取HTML的的容,然后解析HTML在发送其他资源的请求,如css,Javascript,图片等。理解了这个丙容对于后续的学习与成长有菲常大的帮助

模块练习:网页资源引入

const http=require('http');
const fs=require('fs');
const server=http.createServer((request,response)=>{//获取请求url的路径let {pathname}=new URL(request.url,'http://127.0.0.1');// 读取文件内容// 不能写响应头编码,否则没有效果if(pathname==='/'){let html=fs.readFileSync(__dirname+'/test.html');response.end(html);//end()参数可以是Buffer和字符串}else if(pathname==='/index.css'){let css=fs.readFileSync(__dirname+'/index.css');response.end(css);//end()参数可以是Buffer和字符串}else if(pathname==='/index.js'){let js=fs.readFileSync(__dirname+'/index.js');response.end(js);//end()参数可以是Buffer和字符串}else{response.statusCode=404;response.end('<h1>404 Not Found</h1>')}
})
server.listen(9000,()=>{console.log('服务已经启动');
})

静态资源服务

静态资源是指内容长时间不发生改变的资源,例如图片,视频,CSS文件,JS文件,HTML文件,字体文件等
动态资源是指内容经常更新的资源,例如百度首页,网易首页,京东搜索列表页面等

静态资源目录与网站根目录

HTTP服务在哪个文件夹中寻找静态资源,那个文件夹就是静态资源目录,也称之为网站根目录

思考:Vscode中使用live-server访问HTML时,它启动的服务网站根目录是谁?
vscode所打开的文件夹

const http=require('http');
const fs=require('fs');
const server=http.createServer((request,response)=>{//获取请求url的路径let {pathname}=new URL(request.url,'http://127.0.0.1');// 声明一个变量let root=__dirname+'/page';// let root=__dirname+'/../';//__dirname得到的是当前文件所在的文件夹,../是得到上一级文件夹// 拼接文件路径let filePath=__dirname+'/page'+pathname;// 读取文件 fs 异步apifs.readFile(filePath,(err,data)=>{if(err){response.statusCode=500;response.end("文件读取失败~");return;//防止代码继续往下执行};response.end(data);})// mime插件获取pathname的mime赋值content-type
});
server.listen(9000,()=>{console.log('服务已经启动');
});

网页中的URL-绝对路径-相对路径

在这里插入图片描述
在这里插入图片描述
网页中使用URL的场景小结(包括但不限于)如下场景:
a标签href、link标签href、script标签src、img标签src、video audio标签、srcform中的action、AJAX请求中的URL

设置资源类型(mime类型)

媒体类型(通常称为Multipurpose Internet Mail Extensions或MIME类型)是一种标准,用来表示文档、文件或字节流的性质和格式。

mime类型结构:[type]/[subType]
例如: text/html text/css image/jpeg image/png application/json

HTTP服务可以设置响应头Content-Type来表明响应体的MIME类型,浏览器会根据该类型决定如何处理资源
下面是常见文件对应的mime类型:
在这里插入图片描述
对于未知的资源类型,可以选择application/octet-stream类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储,也就是我们常见的下载效果

完善静态资源错误处理

请求方法不是GET的时候也会出现错误

const http=require('http');
const fs=require('fs');
const path=require('path');
const server=http.createServer((request,response)=>{if(request.method !== 'GET'){response.statusCode=405;response.end('<h1>404 Not Found</h1>');return;}let {pathname}=new URL(request.url,'http://127.0.0.1');let root=__dirname+'/page';let filePath=root+pathname;fs.readFile(filePath,(err,data)=>{if(err){response.setHeader('content-type','text/html;charset=utf-8');switch(err){case 'ENOENT':response.statusCode=404;response.end('<h1>404 Not Found</h1>');break;case 'EPERM':response.statusCode=403;response.end('<h1>403 Forbidden</h1>');break;default:response.statusCode=500;response.end('<h1>500 Internal Server Error</h1>');}response.statusCode=500;response.end("文件读取失败~");return;//防止代码继续往下执行};// mime插件获取pathname的mime赋值content-type// 获取文件后缀名let ext=path.extname(filePath).slice(1);//返回的结果是.css,slice(1)从索引1开始// 匹配对应的类型let type=mimes[ext];if(type){response.setHeader('content',type+';text/html;charset=utf-8');}else{// 没有匹配到response.setHeader('content-type','application/octet-stream');};response.end(data);})
}).listen(9000,()=>{console.log('服务已经启动');
});

GET和POST的区别

在这里插入图片描述

GET 和 POST 是 HTTP 协议请求的两种方式。区别:

  1. 作用:
    给服务端新增数据的是post,例如创建新账户;
    向服务端索要资源,加载某些东西是get
  2. 参数位置:
    GET 带参数请求是将参数缀到 URL 之后,在地址栏中输入 url 访问网站就是 GET 请求,
    POST 带参数请求是将参数放到请求体中
  3. POST 请求相对 GET 安全一些,因为在浏览器中参数会暴露在地址栏
  4. GET 请求大小有限制,一般为 2K,而 POST 请求则没有大小限制

模块化

介绍

1.模块化是一个将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程
其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用

2.模块化项目:编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目

3.模块化的一些好处:减少命名冲突、高复用性、高维护性

模块暴露数据两种方式:

1.module.exports=value
2.exports.name=value
使用时有几点注意:
1.module.exports可以暴露任意数据
2.不能使用exports =value 的形式暴露数据,模块内部module与exports的隐式关系exports =module.exports ={}
require返回的值是module.exports的值不是exports
在这里插入图片描述
exports.tiemo=tiemo相当于往{}里添加数据

node.js导入模块

在模块中使用 require 传入文件路径即可引入文件
require 使用的一些注意事项:

  1. 对于自己创建的模块,导入时路径建议写 相对路径 ,且不能省略 ./../
  2. 同名文件查找顺序 .js .json .node
  3. js 和 json 文件导入时可以不用写后缀,c/c++编写的 node 扩展文件也可以不写后缀,但是一
    般用不到
  4. 如果导入其他类型的文件,会以 js 文件进行处理
  5. 如果导入的路径是个文件夹,则会 首先 检测该文件夹下 package.json 文件中 main 属性对应的文件,
    如果 main 属性不存在,或者 package.json 不存在,则会尝试导入文件夹下的 index.jsindex.json ,如果还是没找到,就会报错
  6. 导入 node.js 内置模块时,直接 require 模块的名字即可,无需加 ./../,比如fs、HTTP、path

导入模块的基本流程

require 导入 自定义模块 的基本流程

  1. 将相对路径转为绝对路径,定位目标文件
  2. 缓存检测
  3. 读取目标文件代码
  4. 包裹为一个函数并执行(自执行函数)。通过 arguments.callee.toString() 查看自执行函数
  5. 缓存模块的值
  6. 返回 module.exports 的值

CommonJS模块化规范

module.exportsexports以及require这些都是CommonJS模块化规范中的内容。
而Node.js是实现了CommonJS模块化规范,二者关系有点像JavaScript与ECMAScript

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

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

相关文章

20240427纳米多孔石墨烯力学性能的调控

文献来源&#xff1a;Tuning the mechanical properties of nanoporous graphene: a molecular dynamics study DOI&#xff1a;https://orcid.org/0000-0003-3598-5439 结论&#xff1a;在这项工作中&#xff0c;使用经典MD模拟分析了扶手椅和锯齿形的NPG&#xff08;纳米多…

Ubuntu2004 CMake 使用基础

一、环境安装 win10安装wsl ubuntu2004 #windows c盘工程目录建立软链 ln -s /mnt/c /home/vrviu/ 安装cmake、c编译工具 apt install -y cmake g 二、CMakeLists.txt讲解 准备工作 首先&#xff0c;在/home/vrviu 目录建立一个 cmake 目录 以后我们所有的 cmake 练习都会放…

如何借模板助力小程序开发

不论是奶茶店还是其他行业&#xff0c;想要开发小程序&#xff0c;乔拓云都为你提供了便捷的方案。无需复杂的编程技术&#xff0c;通过套用模板的方式&#xff0c;即可快速打造专属小程序。 在线访问乔拓云官方网站&#xff0c;免费注册账号后&#xff0c;即可进入商城小程序的…

RabbitMQ知识点总结(一)

为什么要使用RabbitMQ? 异步&#xff0c;解耦&#xff0c;削峰。 异步 提高效率&#xff1b;一个挂了&#xff0c;另外的服务不受影响。 解耦 增加或减少服务比较方便。 削峰 每天0点到16点&#xff0c;A系统风平浪静&#xff0c;每秒并发数量就100个。结果每次到了16点到…

SecretFlow学习指南(2)学习路径

目录 一、模块架构 二、模块详解 三、算法协议 四、学习路线 一、模块架构 良好的分层设计可以提高开发效率和可维护性&#xff0c;满足不同用户的需求。隐语从上到下一共分为六层。 ●产品层&#xff1a;通过白屏化产品提供隐语整体隐私计算能力的输出&#xff0c;让用户简…

ZYNQ--PL读写PS端DDR数据

PL 和PS的高效交互是zynq 7000 soc开发的重中之重,我们常常需要将PL端的大量数 据实时送到PS端处理,或者将PS端处理结果实时送到PL端处理,常规我们会想到使用DMA 的方式来进行,但是各种协议非常麻烦,灵活性也比较差,本节课程讲解如何直接通过AXI总 线来读写PS端ddr的数据…

【Pytorch】(十三)模型部署: TorchScript

文章目录 &#xff08;十三&#xff09;模型部署: TorchScriptPytorch动态图的优缺点TorchScriptPytorch模型转换为TorchScripttorch.jit.tracetorch.jit.scripttrace和script的区别总结trace 和script 混合使用保存和加载模型 &#xff08;十三&#xff09;模型部署: TorchScr…

掌静脉识别关键技术研究综述

掌静脉识别作为一种新兴的红外生物识别技术&#xff0c;因其高安全性、活体检测性等优势已成为当前生物特征识别领域中的研究热点之一。近年来&#xff0c;该领域的大量研究通过引入深度学习方法推动了掌静脉识别技术的发展。为了掌握掌静脉识别领域最新研究现状及发展方向&…

ddos云服务器有哪些防御方法和优势

本文将介绍云服务器遇到DDoS攻击的应对方法&#xff0c;包括流量清洗、负载均衡、防火墙设置和CDN加速等。同时&#xff0c;文章还介绍了ddos云服务器的防御优势&#xff0c;包括高防护能力、自动化防御、实时监控和报警以及弹性扩展等。通过这些防御方法和ddos云服务器的应用&…

React复习笔记

基础语法 创建项目 借助脚手架&#xff0c;新建一个React项目(可以使用vite或者cra&#xff0c;这里使用cra) npx create-react-app 项目名 create-react-app是React脚手架的名称 启动项目 npm start 或者 yarn start src是源文件index.js相当于Vue的main.js文件。整个…

vue3 ——笔记 (条件渲染,列表渲染,事件处理)

条件渲染 v-if v-if 指令用于条件性地渲染一块内容&#xff0c;只有v-if的表达式返回值为真才会渲染 v-else v-else 为 v-if 添加一个 else 区块 v-else 必须在v-if或v-else-if后 v-else-if v-else-if 是v-if 的区块 可以连续多次重复使用 v-show 按条件显示元素 v-sh…

【Linux系统化学习】生产者消费者模型(阻塞队列和环形队列)

目录 生产者消费者模型 什么是生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型的优点 为什么生产者和生产者要互斥&#xff1f; 为什么消费者和消费者要互斥&#xff1f; 为什么生产者和消费者既是互斥又是同步&#xff1f; 基于BlockingQueue的生产者…

26版SPSS操作教程(高级教程第十六章)

目录 前言 粉丝及官方意见说明 第十六章一些学习笔记 第十六章一些操作方法 多维尺度分析 不考虑个体差异的多维尺度分析模型 假设数据 具体操作 结果解释 选择不同距离的排列方式 考虑个体差异的多维尺度分析模型&#xff08;INDSCAL&#xff0c;individual differ…

[C++ QT项目实战]----系统实现双击表格某一行,表格数据不再更新,可以查看该行所有信息,选中表更新之后,数据可以继续更新

前言 在需要庞大的数据量的系统中&#xff0c;基于合适的功能对数据进行观察和使用至关重要&#xff0c;本篇在自己项目实战的基础上&#xff0c;基于C QT编程语言&#xff0c;对其中一个数据功能进行分析和代码实现&#xff0c;希望可以有所帮助。一些特殊原因&#xff0c;图片…

车道分割YOLOV8-SEG

车道分割YOLOV8-SEG&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTHON,ANDROID开发 车道分割YOLOV8-SEG

数据污染对大型语言模型的潜在影响

大型语言模型&#xff08;LLMs&#xff09;中存在的数据污染是一个重要问题&#xff0c;可能会影响它们在各种任务中的表现。这指的是LLMs的训练数据中包含了来自下游任务的测试数据。解决数据污染问题至关重要&#xff0c;因为它可能导致结果偏倚&#xff0c;并影响LLMs在其他…

python三维交互可视化工具plotly使用

三维数据可视化工具使用 import plotly.graph_objects as go import numpy as np# 生成随机点 data np.random.uniform(-3,3,(100000, 2)) Z np.exp(-((data[:, 0] - 0)**2 / (2*1**2) (data[:, 1] - 0)**2 / (2*1**2)))scatter1 go.Scatter3d(xdata[:, 0], ydata[:, 1], …

【项目】仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器(Http板块)

【项目】仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器&#xff08;Http板块&#xff09; 一、思路图二、Util板块1、Splite板块&#xff08;分词&#xff09;&#xff08;1&#xff09;代码&#xff08;2&#xff09;测试及测试结果i、第一种测试ii、第二种…

关于discuz论坛网址优化的一些记录(伪静态)

最近网站刚上线&#xff0c;针对SEO做了些操作&#xff0c;为了方便网站网页被收录&#xff0c;特此记录下 1.开启伪静态 按照操作勾选所有项&#xff0c;然后点击查看伪静态规则 2.打开宝塔&#xff0c;找到左侧列表的网站&#xff0c;然后找到相应站点的设置。把discuz自动…

STM32的端口引脚的复用功能及重映射功能解析

目录 STM32的端口引脚的复用功能及重映射功能解析 复用功能 复用功能的初始化 重映射功能 重映射功能的初始化 复用功能和重映射的区别 部分重映射与完全重映射 补充 STM32的端口引脚的复用功能及重映射功能解析 复用功能 首先、我们可以这样去理解stm32引脚的复用功能…