目录
定义:协议( Protocol)是指双方为了完成一个目标结果所必须遵守的规则和约定。 通俗的理解:双方采用约定好的格式来做某种事情,这种事先约定好的格式,就叫做协议。
ip地址是用来标注设备在互联网上位置的 标识
域名 是 ip地址的别名
ip地址可以直接访问网站 域名不行
域名访问网站 要通过DNS服务器翻译为 IP地址才能访问
http:Hyper text transform protocol 超文本传输协议
在这个协议的规定下 客户端和服务器之间 可以传输 超文本文件(文本、视频、音频、图片、css、js...)
交互模型(请求与响应):HTTP 协议采用了 请求/响应 的交互模型。也就是说必须是客户端主动 发起请求,再由服务器端处理请求,同时被动的把内容响应给客户端
在上述模型中 我们可以看到 在 客户端和服务端交互的过程中 存在两个 很重要的环节
客户端发送 请求
服务端进行 响应
在客户端 和 服务端交互的过程中 请求和响应 是交互的主要环节 下面我们就一起来探讨请求和响应的过程
客户端主动发起 向服务端发送请求
客户端发送的请求 实际上 发送的是一个 请求报文文件
请求报文文件:本质上是一个数据包 将请求中需要携带的所有信息数据 打包为一个数据包 进行统一的发送
好处:
更加安全
更加稳定
请求报文的内容
请求命令行(请求行)
请求方式:get/post/put/delete
发送请求的 服务端地址
端口号
协议版本 一般设置为 HTTP/1.1
请求头部(请求头)
对请求报文进行的一些配置
这些配置 通过键值对来配置
请求主体
存放post请求提交的数据
服务端发送的响应 也是响应报文文件
响应报文文件 内容如下
响应命令行
协议版本
响应状态码
响应状态码的描述
响应头部
响应报文的相关 配置信息
通过键值对的形式进行配置
响应主体
服务器给客户端响应的具体数据
说明:
响应状态码:在响应报文中 会携带本次响应的状态码 用来标注本次响应的状态
常见的响应状态码有以下五种
200——OK:响应成功 响应数据 来源为 服务器
304—— :响应成功 响应数据 来源为 本地缓存
403——forbidden:响应失败 没有权限访问此地址
404——not found:响应失败 地址找不到
500及以上—— server error: 响应失败 服务器逻辑问题
node想要搭建服务器 需要使用到一个内置模块——http
这个内置模块 提供了一个方法——createServer 这个方法 可以创建服务器
写法如下
- //1.引入http模块
- let http = require("http");
- //2.调用http模块的 createServer方法
- //这个方法 的 返回值 就是 创建出来的服务器对象
- let server = http.createServer(()=>{
-
- });
- //3.给服务器 设置运行的端口
- //服务器对象.listen(端口号,()=>{ //服务器成功运行后执行的代码 })
- server.listen(3000,()=>{
- console.log("服务器正在运行...")
- })
createServer方法的用法
- http.createServer((req,res)=>{
- //req 全拼为 request:请求
- //res 全拼为 response:响应
- //req形参 接收请求报文相关内容 res形参 接收 响应报文相关的内容
-
- })
res形参的应用
res形参 接收到的是一个对象 这个对象有一个方法——end 可以用来给客户端 响应数据
- http.createServer((req,res)=>{
- //req 全拼为 request:请求
- //res 全拼为 response:响应
- //req形参 接收请求报文相关内容 res形参 接收 响应报文相关的内容
-
- res.end(要响应的数据)
- })
浏览器向 服务器发起请求的方式
我们通过node 编写的服务器 是在本地计算机上运行的 因此被称为 本地服务器
本地服务器 的ip地址——127.0.0.1:3000
本地服务器的域名——localhost:3000
当我们打开服务器地址的时候 就可以看到 服务器响应的数据 但是 服务器如果响应的是中文字符串 会导致乱码,这就需要我们手动设置编码格式
我们可以通过设置响应头 来实现 编码格式的设置
res形参中 给我们提供了一个方法setHeader 可以帮助我们设置 响应头
用法:res.setHeader("键名","键值")
设置编码格式的写法
- http.createServer((req,res)=>{
- //req 全拼为 request:请求
- //res 全拼为 response:响应
- //req形参 接收请求报文相关内容 res形参 接收 响应报文相关的内容
- //设置编码格式
- res.setHeader("content-type","text/plain;charset=utf8")
- res.end(要响应的数据)
- })
在上述代码中 content-type的键值由两部分构成
text/plain:MIME类型
charset=utf8:编码格式
注意:设置响应头的代码 一定要写在 响应数据之前(也就是end方法调用之前)
MIME类型
http是一种超文本传输协议,因此 我们的响应数据 可以是任意类型的数据
但是 在响应不同类型数据的时候 需要将响应头中数据类型进行对应的设置
MIME类型对照表 参见 MIME 类型 | 菜鸟教程
设置响应头的方法
setHeader
- http.createServer((req,res)=>{
- res.setHeader("键名","键值")
- })
writeHead
- http.createServer((req,res)=>{
- res.writeHead(响应状态码,{键名:"键值"})
- })
res形参总结
设置响应头:
res.setHeader
res.writeHead
响应数据
res.end
MIME类型:响应不同类型的文件 需要 设置对应的MIME类型(设置在响应头中)
req形参的应用
req形参的属性
url
- http.createServer((req,res)=>{
- console.log(req.url)
- })
含义:req.url 表示获取请求报文中 url地址中的 资源在服务器中的具体路径部分
应用场景:我们通常使用这个属性 来实现 node的路由
使用url实现路由切换页面
method
- http.createServer((req,res)=>{
- console.log(req.method)
- })
含义:req.method 表示获取请求报文中 请求方式
我们可以使用不同的请求 来测试该属性的效果
在地址栏中输入服务器地址 访问服务器默认是get请求
如果想使用post请求 我们可以使用vscode提供的一个插件 来测试——rest client
rest client的用法
安装了这个插件之后 我们就可以编写一种文件——.http文件
.http文件 就是 请求报文
.http文件的内容 必须要严格遵循 请求报文的格式
node路由中的资源静态化问题
在node路由页面 html文件中 往往会使用到 一些资源文件(图片、视频、音频等)
如果我们直接做路由 这些资源文件 将无法正常加载
这时我们就需要通过资源静态化的方式 让这些页面中的资源文件 能正常加载
资源静态化的规则
1.将所有资源文件 统一存放在一个文件夹中
2.在这个文件夹中 对资源文件 进行分类存储
3.在node服务器代码中 进行资源静态化
接收get请求提交的数据
在node中 我们是通过 req形参来接收的
req形参有一个属性 url 可以接收到get请求提交的查询字符串
- http.createServer((req,res)=>{
- console.log(req.url);
- })
接收post请求提交的数据
在node中 我们是通过req形参的两个事件 来协同工作 接收 post请求提交的数据
分别是 data事件 和 end事件
node中绑定事件的写法
对象.on("事件名",处理函数)
接收post请求提交数据 写法如下
- http.createServer((req,res)=>{
- let d;
- req.on("data",(data)=>{
- //在node开始接收post请求提交的数据的时候 就会触发 data事件
- //形参data 就是用来接收 post请求提交的数据
- d = data;
- });
- req.on("end",()=>{
- //当post请求提交的数据 接收完之后 就会触发end事件
- console.log(d.toString());
- })
- })
注意:接收post提交的数据 接收到的结果 是一个二进制数据 因此 在具体使用的时候 应该先对其进行转换