Node.js开发-HTTP协议

HTTP协议

  • 1) 概念
  • 2) 请求报文的组成
  • 3) HTTP 的请求行
  • 4) HTTP 请求头
  • 5) HTTP 的请求体
  • 6) 响应报文的组成
  • 7) 创建 HTTP 服务
  • 8) 获取 HTTP请求报文
  • 9) 设置 HTTP 响应报文
  • 10) 设置资源类型(mime类型)
  • 11) GET和POST请求的区别

1) 概念

HTTP(hypertext transport protocol)协议;中文叫超文本传输协议

是一种基于TCP/IP的应用层通信协议

协议中主要规定了两个方面的内容

  • 客户端:用来向服务器发送数据,可以被称之为请求报文

  • 服务端:向客户端返回数据,可以被称之为响应报文

报文:可以简单理解为就是一堆字符串

2) 请求报文的组成

组成:

  • 请求行
  • 请求头
  • 空行
  • 请求体

在这里插入图片描述

3) HTTP 的请求行

请求行

  • 请求方法(get、post、put、delete等)
  • 请求 URL(统一资源定位器)
    • 例如:http://www.baidu.com:80/index.html?a=100&b=200#logo
      • http: 协议(https、ftp、ssh等)
      • www.baidu.com 域名
      • 80 端口号
      • /index.html 路径
      • a=100&b=200 查询字符串
      • #logo 哈希(锚点链接)
  • HTTP协议版本号

4) HTTP 请求头

格式:『头名:头值』

常见的请求头有:

请求头解释
Host主机名
Connection连接的设置 keep-alive(保持连接);close(关闭连接
Cache-Control缓存控制 max-age = 0 (没有缓存)
Upgrade-Insecure-Requests将网页中的http请求转化为https请求(很少用)老网站升级
User-Agent用户代理,客户端字符串标识,服务器可以通过这个标识来识别这个请求来自哪个客户端 ,一般在PC端和手机端的区分
Accept设置浏览器接收的数据类型
Accept-Encoding设置接收的压缩方式
Accept-Language设置接收的语言 q=0.7 为喜好系数,满分为1
Cookie

5) HTTP 的请求体

请求体内容的格式是非常灵活的,

  • (可以是空)==> GET请求,
  • (也可以是字符串,还可以是JSON)===> POST请求

例如:

  • 字符串:keywords=手机&price=2000

  • JSON:{“keywords”:“手机”,“price”:2000}

6) 响应报文的组成

在这里插入图片描述

1.响应行

HTTP/1.1 200 OK
  • HTTP/1.1:HTTP协议版本号
  • 200:响应状态码 404 Not Found 500 Internal Server Error
    • 参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
  • OK:响应状态描述

2.响应头

Cache-Control:缓存控制 private 私有的,只允许客户端缓存数据
Connection 链接设置
Content-Type:text/html;charset=utf-8 设置响应体的数据类型以及字符集,响应体为html,字符集utf-8
Content-Length:响应体的长度,单位为字节

3.空行

4.响应体

响应体内容的类型是非常灵活的,常见的类型有 HTML、CSS、JS、图片、JSON

7) 创建 HTTP 服务

使用 nodejs 创建 HTTP 服务

// 1.导入http模块
const http = require("http");// 2.创建服务对象
const server = http.createServer((request, response) => {response.end("Hello Http Server"); // 设置响应体
});// 3.监听端口,启动服务
server.listen(9000, () => {console.log("服务已经启动。。。");
});

http.createServer 里的回调函数的执行时机: 当接收到 HTTP 请求的时候,就会执行

8) 获取 HTTP请求报文

想要获取请求的数据,需要通过 request 对象

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

注意事项:

  • 1.request.url 只能获取路径以及查询字符串,无法获取 URL 中的域名以及协议的内容
  • 2.request.headers 将请求信息转化成一个对象,并将属性名都转化成了『小写』
  • 3.关于路径:如果访问网站的时候,只填写了 IP 地址或者是域名信息,此时请求的路径为『 / 』
  • 4.关于 favicon.ico:这个请求是属于浏览器自动发送的请求
//1. 导入 http 模块
const http = require('http');//2. 创建服务对象
const server = http.createServer((request, response) => {//获取请求的方法// console.log(request.method);//获取请求的 url// console.log(request.url);// 只包含 url 中的路径与查询字符串//获取 HTTP 协议的版本号// console.log(request.httpVersion);//获取 HTTP 的请求头console.log(request.headers);response.end('http'); //设置响应体
});//3. 监听端口, 启动服务
server.listen(9000, () => {console.log('服务已经启动....')
});

9) 设置 HTTP 响应报文

作用语法
设置响应状态码response.statusCode
设置响应状态描述response.statusMessage ( 用的非常少 )
设置响应头信息response.setHeader(‘头名’, ‘头值’)
设置响应体response.write(‘xx’); response.end(‘xxx’);
//导入 http 模块
const http = require('http');//创建服务对象
const server = http.createServer((request, response) => {// 设置响应码response.statusCode = 200;// 设置响应状态描述response.statusMessage = "I LOVE YOU";// 设置响应头response.setHeader("content-type", "text/html;charset=utf-8");response.end("response");
});//3. 监听端口, 启动服务
server.listen(9000, () => {console.log('服务已经启动....')
});

10) 设置资源类型(mime类型)

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

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

HTTP 服务可以设置响应头 Content-Type 来表明响应体的 MIME 类型,浏览器会根据该类型决定如何处理资源

下面是常见文件对应的 mime 类型

html: 'text/html',
css: 'text/css',
js: 'text/javascript',
png: 'image/png',
jpg: 'image/jpeg',
gif: 'image/gif',
mp4: 'video/mp4',
mp3: 'audio/mpeg',
json: 'application/json'

对于未知的资源类型,可以选择 application/octet-stream 类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储,也就是常见的 下载 效果

/*** 创建一个Http服务,端口为9000*  GET /index.html         响应 page/index.html*  GET /css/app.css        响应 page/css/app.css*  GET /images/logo.png    响应 page/image/log.png*/
const http = require("http");
const fs = require("fs");
const path = require("path");
// 声明变量
let mines = {html: 'text/html',css: 'text/css',js: 'text/javascript',png: 'image/png',jpg: 'image/jpeg',gif: 'image/gif',mp4: 'video/mp4',mp3: 'audio/mpeg',json: 'application/json'
}const server = http.createServer((request, response) => {if (request.method != "GET") {response.statusCode = 405;response.end("<h1>Method Not Allowed</h1>");}// 获取url请求路径let {pathname} = new URL(request.url, "http:127.0.0.1");// 拼接根路径let root = __dirname + "/page"// 拼接文件路径let filePath = root + pathname;// 读取文件fs异步apifs.readFile(filePath, (err, data) => {if (err) {response.setHeader("content-type", "charset=utf-8");// 判断错误的代号switch (err.code) {case "ENOENT":response.statusCode = 404;response.end("<h1>Not Found</h1>");case 'EPERM':response.statusCode = 403;response.end("<h1>Forbidden</h1>");default:response.statusCode = 500;response.end("<h1>Bye Bye</h1>");}return;}// 获取文件后缀名let ext = path.extname(filePath).slice(1);// 获取对应的类型let type = mines[ext];if (type) {// 匹配到了if (ext === "html") {response.setHeader("content-type", type + ";charset=utf-8");} else {response.setHeader("content-type", type);}} else {// 没有匹配到response.setHeader("content-type", "application/octet-stream");}response.end(data);});});server.listen(9000, () => {console.log("服务启动。。。");
});

11) GET和POST请求的区别

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

  • GET 主要用来获取数据,POST 主要用来提交数据
  • GET 带参数请求是将参数缀到 URL 之后,在地址栏中输入 url 访问网站就是 GET 请求,POST 带参数请求是将参数放到请求体中
  • POST 请求相对 GET 安全一些,因为在浏览器中参数会暴露在地址栏
  • GET 请求大小有限制,一般为 2K,而 POST 请求则没有大小限制

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

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

相关文章

国产手机大量采用国产OLED屏幕,三星屏占比大幅减少了

在以往采用三星OLED屏幕曾是国产期间手机的标配&#xff0c;然而2023年国产手机品牌突然大幅减少了对三星OLED屏幕的采用&#xff0c;而大幅增加了国产OLED屏幕的采用比例&#xff0c;推动国产OLED屏幕的市占率大幅上涨。 2023年由于高通提前发布销量8G3&#xff0c;由此导致中…

[C#] 如何调用Python脚本程序

为什么需要C#调用python&#xff1f; 有以下几个原因需要C#调用Python&#xff1a; Python拥有丰富的生态系统&#xff1a;Python有很多强大的第三方库和工具&#xff0c;可以用于数据科学、机器学习、自然语言处理等领域。通过C#调用Python&#xff0c;可以利用Python的生态系…

控制台打印进度条

引言 进度条是用户界面中常见的组件&#xff0c;尤其是在执行长时间操作时。虽然在控制台应用程序中没有图形用户界面那样的视觉组件&#xff0c;但我们可以使用字符来模拟进度条&#xff0c;为用户提供任务执行的视觉反馈。 执行开始… 当前进度: 0% [ ] 当前进度: 1% [ ] 当…

安装 NVIDIA Chat with RTX

安装 NVIDIA Chat with RTX 0. NVIDIA Chat with RTX 是什么&#xff1f;1. 安装 NVIDIA Chat with RTX2. 使用 NVIDIA Chat with RTX3. NVIDIA Chat with RTX 下载地址 0. NVIDIA Chat with RTX 是什么&#xff1f; Chat With RTX 是一款演示应用程序&#xff0c;可让您个性化…

C语言-----用二维数组解决菱形的打印问题

1.打印菱形&#xff0c;多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 #include <stdio.h>int main() {int n0;while(scanf("%d",&n)! EOF){int i0;int j0;f…

【JavaSE篇】——String的常用方法(全面知识覆盖)

目录 字符串常用方法 &#x1f388;字符串构造 &#x1f388;字符串长度(length) &#x1f388;字符串是否为空(empty) &#x1f388;String对象的比较 &#x1f308;比较是否引用同一个对象(boolean&#xff09; &#x1f308;boolean equals(Object anObject) 方法&#xff1…

【Python】Python代码的单元测试

Python代码的单元测试 单元测试的概念 定义&#xff1a;是指对软件中的最小可测试单元进行检查和验证。 作用&#xff1a;可以确保程序模块是否否和我们规范的输出&#xff0c;保证该模块经过修改后仍然是满足我们的需求。 单元测试的策略 如果要创建单元测试&#xff0c;…

java SSM新闻管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM新闻管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

Map和Set(哈希表)

目录 map&#xff1a; map说明&#xff1a; Map.Entry的说明&#xff1a;,v> Map 的常用方法: 演示&#xff1a; 注意&#xff1a; TreeMap和HashMap的区别 Set&#xff1a; 常见方法说明&#xff1a; 注意&#xff1a; TreeSet和HashSet的区别 哈希表: 冲突&a…

使用LORA微调RoBERTa

模型微调是指在一个已经训练好的模型的基础上&#xff0c;针对特定任务或者特定数据集进行再次训练以提高性能的过程。微调可以在使其适应特定任务时产生显着的结果。 RoBERTa&#xff08;Robustly optimized BERT approach&#xff09;是由Facebook AI提出的一种基于Transfor…

【王道数据结构】【chapter5树与二叉树】【P158t8】

设树B是一颗采用链式结构存储的二叉树&#xff0c;编写一个把树B种所有节点的左、右子树进行交换的函数。 #include <iostream> #include <stack> typedef struct treenode{char data;struct treenode *left;struct treenode *right; }treenode,*ptreenode;ptreeno…

docker磁盘不足!已解决~

目录 &#x1f35f;1.查看docker镜像目录 &#x1f9c2;2.停止docker服务 &#x1f953;3.创建新的目录 &#x1f32d;4.迁移目录 &#x1f37f;5.编辑迁移的目录 &#x1f95e;6.重新加载docker &#x1f354;7.检擦docker新目录 &#x1f373;8.删掉旧目录 1.查看doc…