Asp.net core 少走弯路系列教程(五)HTTP 协议学习
前言
新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力。
新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马。
作者认为新人应该先打好基础,不要直接学习框架,例如先掌握 SQL 再使用 EFCore 框架。
作者只传授数年内不会变化的知识,让新手学习快速进入跑道受益终身。
分享使我快乐,请务必转发给同学,朋友,让大家都少走一些弯路!!
可能会疑惑为什么要了解 HTTP 协议,我只能说这是基础,了解 HTTP 网络协议对以后网络编程有很大的帮助。并且在与 WebApi 交互时更容易排查出问题的原因。
浏览器与服务器的工作原理
目前我们在学习了 HTML,CSS,JavaScript 后,可以根据需求将数据和前端代码拼接在一起后给浏览器运行。其实,我们的数据和前端代码是应该由我们的Asp.net core应用程序来打印到浏览器中运行的,不是我们目前直接将.html页面展开运行的。这样就涉及到浏览器和Java应用程序之间需要进行数据的交互。比如:
浏览器运行网页--->网页收集用户数据--->发送Asp.net core应用程序处理。
Asp.net core应用程序处理浏览器的请求---->将处理结果发送给浏览器--->浏览器将结果展现。
我们先不考虑浏览器和Asp.net core应用程序之间进行数据交互的具体代码的实现,浏览器是代码写的,Asp.net core应用程序也是代码写的,而且使用的是不同的开发语言。
现在是两个不同的软件之间要进行数据的交互,那么是浏览器随便发送什么格式的数据,我们的Asp.net core应用程序就能直接识别使用的吗?
不能,浏览器和Asp.net core应用程序之间必须按照指定的规范来进行数据的交互。那么使用什么样的格式呢?
浏览器和Asp.net core应用程序之间约定一个数据交互的规范(HTTP协议)
HTTP通信机制是在一次完整的 HTTP 通信过程中,客户端与服务器之间将完成下列7个步骤:
1、建立 TCP 连接
在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;
2、客户端向服务器发送请求命令
一旦建立了TCP连接,客户端就会向服务器发送请求命令;
例如:GET/sample/hello.jsp HTTP/1.1
3、客户端发送请求头信息
客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;
4、服务器应答
客户端向服务器发出请求后,服务器会客户端返回响应;
例如: HTTP/1.1 200 OK
响应的第一部分是协议的版本号和响应状态码
5、服务器返回响应头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档;
6、服务器向客户端发送数据
服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;
7、服务器关闭 TCP 连接
一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTP协议介绍
html页面上全是文字,但是浏览器解析之后,展现出来的页面是非常丰富的
超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写, HTTP是万维网(WWW:World Wide Web)的数据通信的基础。
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

HTTP1.0
最早在1996年在网页中使用,内容简单,所以浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态),请求只能由客户端发起(单向性)。
HTTP1.1
到1999年广泛在各大浏览器网络请求中使用,HTTP/1.0中默认使用Connection: close。在HTTP/1.1中已经默认使用Connection: keep-alive(长连接),避免了连接建立和释放的开销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。
1.1中最重要的一个特点是支持“长连接”,即“一次连接可以多次请求”。

HTTP 1.1支持持久连接(HTTP/1.1的默认模式使用带流水线的持久连接),在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
请求报文结构:

- 方法名 GET、POST
- Content-Length: 32 是主体内容的长度(GET 没有主体和 Content-Length)
响应报文结构:

- Content-Length: 256 是主体内容的长度
- Content-Type: text/html 是体客户端应该把主体当作 HTML(text/plan 则当作文本)
请求数据结构
1、QueryString 是一种跟随 url key-value 数据结构:
https://www.baidu.com/s?ie=UTF-8&wd=dotnet
- QueryString["id"] = "UTF-8"
- QueryString["wd"] = "dotnet"
2、Form 与 QueryString 数据格式一致,它在 POST 请求报文的主体中:
POST / HTTP/1.1
Host: www.baidu.com
Content-Length: 18
Content-Type: application/x-www-from-urlencoded
ie=UTF-8&wd=dotnet
- Form["id"] = "UTF-8"
- Form["wd"] = "dotnet"
3、JSON
POST / HTTP/1.1
Host: www.baidu.com
Content-Length: 33
Content-Type: application/json
{ "ie": "UTF-8", "wd": "dotnet" }
服务器遇到这种请求报文,将主体内容以 JSON 的解析得到对应的参数值。(注意它比 QueryString/Form 占用更多的字节)
使用 Chrome 浏览器观察 HTTP协议
在 Chrome 使用 F12 打开开发者工具,然后访问 cnblogs 首页如下:

我们很直观的看到,浏览器访问 github 页面包含了 html、css、以及很多图片,大概顺序:
- 请求 github.com/xxx 页面,得到 HTML
- 渲染 HTML 的时候:
- 遇到 <img ..> 图片,发送 HTTP 请求图片
- 遇到 <style ..> 样式,发送 HTTP 请求 .css 样式文件
- 遇到 <script ..> 脚本,发送 HTTP 请求 .js 脚本文件
点击图中任何一项,可进入详细的内容,请求报文,响应报文。
使用命令行请求网页
这里特别介绍在 command.exe 中请求一个网页:


输入以下内容(注意两个换行):
GET / HTTP/1.1
Host: www.cnblogs.com
Accept-Language: zh-CN

HTTP/1.1 302 Found
Date: Thu, 29 Sep 2022 11:35:06 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: https://www.cnblogs.com/
Via: HTTP/1.1 SLB.52
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
响应 302 是因为我们访问的是 http://www.cnblogs.com/,服务器跳转到 https://www.cnblogs.com/
Location: https://www.cnblogs.com/
HTTP 协议还有很多知识,但是对新手而已学到这里算入门了,千万不要指望一下能吃下所有内容(贪吃蛇的后果),只有反复的实战才能彻底领会贯通。
到这里,你已经对 HTTP 协议有了初步的认识,为我们以后深入打下了基础,下一篇我们学习 C# 语言知识吧!
系列文章导航
- (一)了解 W3C
- (二)HTML 学习
- (三)CSS 学习
- (四)JavaScript 学习
- (五)了解 HTTP 协议
- (六)C# 语法学习
- (七)WebApi 学习
- (八)数据库 CRUD 增删改查学习
- (九)待续。。
原创保护,转载请注明出处:https://www.cnblogs.com/FreeSql/p/16782488.html
Asp.net core 少走弯路系列教程(五)HTTP 协议学习的更多相关文章
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Blazor编程系列十五——查询
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
- 学习ASP.NET Core Blazor编程系列二十五——登录(4)
学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列九——增加查询功能
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十七——分组
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- linux shell 脚本调试技巧
本文分享自天翼云开发者社区<linux shell 脚本调试技巧>,作者:g****n 1.bash -x 加脚本 这是最常用的调试手段,终端会打印出,脚本执行过程中的每一个命令. a. ...
- 打工人最强福音上线!AOne终端全面接入DeepSeek大模型!
DeepSeek深度融合国产AI生态,国云连放大招! 继天翼云多款产品上线DeepSeek后, 见证企业级智能办公的时刻来了! 天翼云AOne联合国产大模型王者DeepSeek 带着671B满血版.7 ...
- 本地部署Grok2.0
Grok-beta2.0(通过ChatBox实现) 个人使用: 1.注册登录 官方地址https://x.ai/ 2.创建API密钥 地址https://console.x.ai/ 3.登录githu ...
- 库卡KUKA机器人KRC4伺服马达维修指导分析
通常情况下,库卡机器人伺服电机是实现机器人的关键组件,它提供了动力.位置和速度控制力和扭矩控制以及闭环控制等功能,使得库卡机器人能够在各种应用场景中发挥机器本身的性能. 一. 如果KUKA库卡机器人K ...
- linux rpm包下载
下载地址 pkg.org 下载方法 搜索包名 找到需要的包 点击去,找到Download wget [Download url] 没有包管理器,恶心,真他妈恶心,我都不想使,还说啥稳定,环境都配不起来 ...
- MyBatisPlus - [07] Q&A
题记部分 001 || Public Key Retrieval is not allowed 通常出现在使用JDBC连接数据库时,特别时在尝试通过SSL/TLS加密连接到MySQL或MariaDB数 ...
- MySQL - 数据更新场景
Excel文件数据更新到表A的某两个字段 Excel文件中Sheet1页有两列,一列是序号,另一列是手机号.表A中有对应的序号列和手机号列. 1.首先,使用Navicat将Excel数据导入数据库,注 ...
- 【MIPS】P2课下零碎
1..word使用 .word 0:63 并非划出了64个 4Byte 地址,而是63个,可从编译后Label窗口中查看 2.syscall读取字符 li $v0, 12 syscall 此时\n也会 ...
- angular项目中修改nz-zorro组件库字体大小
有时候我们开发时使用到的组件库,可能样式不是符合我们的需求,我试着从谷歌调试工具获取组件的类,给他设置样式,如下我设置tabset的样式 .ant-tabs-nav .ant-tabs-tab { f ...
- tsconfig.json报错问题
tsconfig.json报错问题 前言 创建 tsconfig.json 配置文件时,VS Code 会自动检测当前项目当中是否有ts文件,若没有则报错,提示用户需要创建一个ts文件后,再去使用ty ...