关于 HTTP 协议,你了解多少?

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

文章目录

  • 一、前言
  • 二、HTTP协议
    • 2.1 简介
    • 2.2 请求行、请求体和请求头
    • 2.3 响应行、响应头部和响应体
  • 三、扩展
    • 3.1HTTP协议和Socket
  • 四、总结


一、前言

FastAPI 是建立在 HTTP 协议之上,所以为了更好的掌握 FastAPI。我们需要先简单的了解一下 HTTP协议

二、HTTP协议

2.1 简介

HTTP(Hypertext Transfer Protocol)遵循经典的客户端-服务器模型,客户端打开连接以发出请求,然后等待直到收到响应。同时也是Web中最基本的协议之一,用于在浏览器和服务器之间传输超文本和其他资源。

以下是HTTP协议的详细介绍:

  1. 基于 TCP/IP协议
    HTTP协议是基于 TCP/IP协议之上的应用层协议

  2. 请求-响应模型
    HTTP使用请求-响应模型,客户端发送请求给服务器,服务器处理请求并返回响应给客户端。换句话说,肯定是客户端先发送请求,然后服务端接到请求后,再有响应。请求由一个请求行、请求头部和请求体组成,响应由一个响应行、响应头部和响应体组成。

  3. 无状态
    指HTTP协议本身不会对请求和响应之间的状态进行持久化。每个HTTP请求都是独立的,服务器不会保留任何与之前请求相关的状态信息。
    当客户端发送一个HTTP请求给服务器时,服务器会根据请求进行处理并返回响应。在这个过程中,服务器并不会记住之前的请求或与之相关的任何状态。每个请求都是相互独立的,服务器只会根据当前请求的内容和上下文进行处理。

  4. 请求方法
    HTTP定义了多种请求方法,常用的包括:

    1. GET:获取指定资源的表示

    2. POST:在服务器上创建新资源

    3. PUT:更新指定资源的表示

    4. DELETE:删除指定资源

  5. URL(Uniform Resource Locator):
    URL用于标识和定位互联网上的资源。它由协议类型(如HTTP)、主机名、端口号、路径和查询参数等组成,例如:http://example.com/path?param=value。

  6. 请求头部
    请求头部包含了客户端向服务器发送的附加信息,例如User-Agent、Accept-Language、Content-Type等。这些头部信息提供了请求的上下文和要求。

  7. 响应状态码
    HTTP定义了多种状态码,用于表示服务器对请求的处理结果。比如:

    1. 200 OK:请求成功

    2. 404 Not Found:请求的资源不存在

    3. 500 Internal Server Error:服务器内部错误

  8. 响应头部
    响应头部包含了服务器返回的附加信息,如Content-Type、Content-Length、Cache-Control等。这些头部信息提供了相应的上下文和属性。

  9. 请求和响应体
    请求体用于发送数据给服务器,通常在POST和PUT请求中使用。响应体包含了服务器返回的数据,可以是HTML文档、JSON数据、图片等。

  10. Cookie和会话管理
    HTTP支持使用Cookie来跟踪和管理会话状态。服务器可以在响应中设置Cookie,而客户端会将Cookie保存并在随后的请求中发送给服务器。

  11. 安全性
    HTTP本身是无状态和明文的协议,因此对于敏感信息的传输,需要使用HTTPS(HTTP over TLS)来进行加密和身份验证,以确保通信的安全性。

HTTP协议是Web通信的核心协议之一,它定义了客户端和服务器之间的请求和响应交互方式。通过遵循HTTP协议,浏览器和服务器能够进行可靠和高效的通信,实现Web应用程序的开发和交互。

2.2 请求行、请求体和请求头

一个HTTP请求由请求行、请求头部和请求体组成。下面详细介绍每个部分的内容:

  1. 请求行(Request Line):请求行包含了请求的方法、URL和HTTP协议版本。它的格式如下:
     METHOD URL HTTP_VERSION

    1.  METHOD是请求的方法,例如GET、POST、PUT等。
    2.  URL是请求的目标资源的URL,包括协议、主机名、端口号、路径和查询参数等。
    3.  HTTP\_VERSION是HTTP协议的版本,如HTTP/1.1。
  1. 请求头部(Request Headers):请求头部包含了客户端向服务器发送的附加信息。每个请求头部都由一个键值对组成,格式为Header-Name: Header-Value。一些常见的请求头部包括:

    1. User-Agent:指定客户端的用户代理(通常是浏览器),用于服务器识别客户端的类型和版本。
    2. Accept:指定客户端能够接受的响应内容类型。
    3. Content-Type:指定请求体的内容类型。
    4. Authorization:用于身份验证,包含了认证凭证。
  2. 请求体(Request Body):请求体用于在POST、PUT等请求方法中发送数据给服务器。它包含了请求的有效载荷,可以是表单数据、JSON数据、文件等。请求体的格式和内容类型由Content-Type头部指定。需要注意 GET 请求没有请求体,它的参数在请求行里面。
    请求行和请求头部都是以CRLF(回车换行符)作为分隔符进行分割,最后以一个空行表示头部结束。如果请求有请求体,则紧跟在空行之后。

以下是一个完整的HTTP请求的例子,包括请求行、请求头部和请求体:


    POST /api/users HTTP/1.1
    Host: example.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36
    Content-Type: application/json
    Content-Length: 52

    {
      "username": "john",
      "password": "secretpassword"
    }

在这个例子中:
请求行:POST /api/users HTTP/1.1

  • 请求方法为POST,表示希望在服务器上创建新的资源。
  • URL为/api/users,表示目标资源的路径。
  • HTTP版本为HTTP/1.1。

请求头部:

  • Host: example.com:指定请求的目标服务器的主机名。
  • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36:指定客户端的用户代理,告诉服务器使用的浏览器和操作系统信息。
  • Content-Type: application/json:指定请求体的内容类型为JSON格式。
  • Content-Length: 52:指定请求体的长度,以字节为单位。

请求体:

{
      "username": "john",
      "password": "secretpassword"
    }

请求体是一个JSON格式的数据,在这个例子中包含了用户名和密码字段。

总结来说,这个例子展示了一个使用POST方法发送JSON数据的HTTP请求。请求行指定了请求方法、URL和HTTP版本。请求头部包含了附加的请求信息,如主机名、用户代理和内容类型。请求体包含了要发送给服务器的数据。

2.3 响应行、响应头部和响应体

HTTP协议中的响应由一个响应行、响应头部和响应体组成。以下是它们的详细说明:

  1. 响应行(Response Line):响应行是HTTP响应的第一行,它包含了协议版本、状态码和状态消息。例如,一个典型的响应行可能是这样的:HTTP/1.1 200 OK。其中,"HTTP/1.1"是协议版本,"200"是状态码,"OK"是状态消息。

  2. 响应头部(Response Headers):响应头部包含了关于响应的元信息,如服务器类型、日期、内容类型等。它由多个以冒号分隔的键值对组成,每个键值对占据一行。例如,以下是一些常见的响应头部字段:

    1. Content-Type:指定了响应体的MIME类型,例如"text/html"表示HTML文档。
    2. Content-Length:指定了响应体的长度,以字节为单位。
    3. Server:指定了服务器的类型和版本信息。
    4. Date:指定了响应生成的日期和时间。
  3. 响应体(Response Body):响应体包含了实际的响应数据。它可以是HTML文档、JSON数据、图像等等,具体取决于请求所期望的内容类型和服务器的支持。响应体通常位于响应头部之后的空行之后。

以下是一个完整的HTTP响应的例子,包括响应行、响应头部和响应体,其中响应体为JSON格式:

   HTTP/1.1 200 OK
    Date: Tue, 02 Mar 2024 12:00:00 GMT
    Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
    Content-Type: application/json
    Content-Length: 52

    {
      "message": "Hello, world!",
      "status": 200
    }

在这个例子中:
响应行:HTTP/1.1 200 OK

  • HTTP版本为HTTP/1.1。
  • 状态码为200,表示请求成功。
  • 状态消息为OK,表示请求被成功处理。

响应头部:

  • Date: Tue, 02 Mar 2024 12:00:00 GMT:指定响应生成的日期和时间。
  • Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips:指定服务器的软件和版本信息。
  • Content-Type: application/json:指定响应体的内容类型为JSON格式。
  • Content-Length: 52:指定响应体的长度,以字节为单位。

响应体:

    {
      "message": "Hello, world!",
      "status": 200
    }

响应体是一个JSON格式的数据,在这个例子中包含了一个消息和状态字段。

总结来说,这个例子展示了一个使用HTTP/1.1协议的HTTP响应。响应行指定了HTTP版本、状态码和状态消息。响应头部包含了附加的响应信息,如日期、服务器信息和内容类型。响应体包含了服务器返回的实际数据,可以是JSON、HTML、图片等不同类型的数据。

三、扩展

3.1HTTP协议和Socket

HTTP协议和Socket之间存在密切的关系。HTTP协议是一种应用层协议,用于在客户端和服务器之间传输超文本数据(例如网页、图片等)。而Socket是一种用于网络通信的编程接口,提供了在网络上发送和接收数据的能力。

HTTP协议使用了底层的Socket技术来进行通信。当客户端发送HTTP请求时,它会创建一个Socket连接到服务器的指定端口,并通过Socket发送请求。服务器在接收到请求后,也通过Socket向客户端发送HTTP响应。

具体来说,客户端在与服务器建立连接时,会创建一个客户端Socket。客户端Socket会与服务器的IP地址和端口号相关联,用于在网络上与服务器进行通信。客户端通过Socket发送HTTP请求,并接收服务器发送的HTTP响应。

服务器端也会创建一个服务器Socket,用于监听指定的端口,并等待客户端的连接请求。当服务器接收到客户端连接请求后,会为该客户端创建一个与之关联的Socket。服务器通过这个Socket与客户端进行通信,接收客户端的HTTP请求,并发送HTTP响应。

Socket提供了一种基于TCP/IP协议的可靠的双向通信方式。HTTP协议利用Socket提供的底层通信能力,在客户端和服务器之间传输HTTP请求和响应数据。Socket隐藏了底层网络细节,使得开发人员可以更方便地使用HTTP协议进行网络通信。

总结来说,HTTP协议和Socket密切相关,Socket提供了HTTP协议进行通信所需的底层网络传输能力,使得客户端和服务器可以通过HTTP协议进行数据交换。

四、总结

文章通过深入浅出的方式,让读者对FastAPI背后的HTTP协议有了全面的认识。从HTTP的基本原理到请求与响应的详细结构,文章提供了丰富的信息和实用的例子,帮助读者理解Web开发中的关键概念。对于希望构建高效、可靠Web应用程序的开发者来说,这是一篇极具价值的教程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析的具体流程

1.导入 表格导入数据时要注意数据的格式问题非表格导入 可以先将文档放入word中 将换行符(^p)替换为|||,选择特殊格式中的段落标记 进行全部替换 以每一列最后的数据/平,作为换行的标志 将所整理的信息导入excel,对数据进行分列 选…

数据库系统概论-第5章 数据库完整性

5.1 实体完整性 5.2 参照完整性 5.3 用户定义完整性 5.4 完整性约束命名子句 5.5 域中的完整性限制 5.6 断言 5.7 触发器 5.8 小结

OpenGL+QT实现矢量和影像的叠加绘制

一、QT下OpenGL框架的初始化 OpenGL的介绍我在这里就没有必要介绍了,那OpenGL和QT的结合在这里就有必要先介绍一下,也就是怎么使用QT下的OpenGL框架。要想使用QT下的OpenGL框架,就必须要子类化QGLWidget,然后实现。 void initia…

冶炼金属 (第十四届蓝桥杯省赛C++ B组)详解(二分+推公式)

题目描述: 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。 这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时&#…

Spring MVC文件下载配置

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 文件下载 在Spring MVC中通常利用commons-io实现文件下载,示例代码如下: Controller RequestMapping("......") public class DownloadC…

AI大模型-Grok搭建

Grok搭建 硬件要求项目下载Checkpoint下载运行代码 马斯克又搞事情了,正式开源AI大模型Grok-1,免费还可商用,国内AI技术即将迎来重大突破。笔者简单整合了一下,如何搭建Grok-1的思路,供后期自己搭建以及读者学习使用。…

房屋租赁系统|基于JSP技术+ Mysql+Java+ B/S结构的房屋租赁系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

理解数据库习题

1.选择 (1)现实世界中客观存在并能相互区别的事物称为( )。 A.实体 B.实体集 C字段 D 记录 (2)下列实体类型的联系中,属于一对一联系的是( )A.教研室对教师的所属联系 …

centos 环境部署

一、安装redis 1. 升级 GCC 最直接的解决方式是升级你的 GCC 编译器到支持 C11 标准的版本。CentOS 7 默认的 GCC 版本较旧,可能不支持 _Atomic。你可以通过以下步骤升级 GCC: 启用 CentOS 的 Software Collections (SCL) 仓库,该仓库提供了…

力扣---完全平方数

思路: 还是比较好想的,g[i]定义为和为 i 的完全平方数的最少数量。那么递推关系式是g[i]min(g[i-1],g[i-4],g[i-9],...)1,数组初始化是g[0]0,g[1]1。注意这里要对g[0]初始化,(举个例子)因为在遍历到g[4]时&…

docker安装Milvus

docker安装Milvus 拉去CPU版本的milvus镜像 $ sudo docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 mkdir -p milvus/conf cd milvus/conf ls wget https://raw.githubusercontent.com/milvus-io/milvus/v0.1…

未来教育趋势:AI个性化培训如何推动企业与员工共赢

AI定制学习:重新定义个性化员工培训的未来 随着人工智能(AI)技术的迅猛发展,我们正目睹并亲历了AI在培训领域所引发的根本性变革。AI技术的整合不仅革新了知识传递的模式,而且重新塑造了个性化学习的内涵。依托于尖端算…

平替电容笔哪个品牌好?推荐五款 2024 高人气电容笔,入手不亏!

作为一名有着多年测评数码经验的评测师,用过的原装笔和平替电容笔加起来也有不下十款了,看过也有很多朋友因为选错电容笔,导致书写效率低,体验感差的例子也数不胜数。这并非夸大其词,因为不专业产品的最大弊端就是毫无…

segformer多分类语义分割

前言 本期将分享「Segformer」,论文地址https://arxiv.org/abs/2105.15203。 Segformer简介 全局上下文信息: 由于Transformer的自注意力机制,Segformer可以在整个图像范围内捕获上下文信息,而不受局部感受野的限制,这有助于提高分…

开放签开源电子签章白皮书-简版

开放签开源电子签章白皮书-简版 一、摘要: 开放签电子签章团队源自于电子合同SaaS公司,立志于通过开源、开放的模式,结合团队十多年的行业经验,将电子签章产品更简单、更低门槛的推广到各行各业中。让电子签章应用更简单&#x…

动态路由协议-OSPF与LSA简介

一、概述 前面路由基础学习了路由的类型可以按照动静态路由分类,静态路由就是直连和手动配置的路由,而动态路由协议是各路由器相互动态学习的一种路由协议,现在常用的有OSPF和ISIS路由协议,前面在基础篇我们也已经对OSPF有一个简单…

记录我的第一次面试

面试感受 这是我的第一次面试,我感觉我这次面试的很差,很糟糕,十分的糟糕,万分的糟糕。第一次面试,面试了半个小时。我去真的好紧张,脑子里一篇空白。脑子空白还不是最惨的,最惨的是那个八股文…

MySQL的概述与安装

一、数据库的基本概念: 1.1 数据: 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是…

基于SSM的宿舍管理系统的设计与实现(JSP,MySQL)

摘 要 随着社会发展、信息技术的普及,人们日常管理工作也发生了巨大的变化。信息化技术之渗透各行业的方方面面。学生宿舍管理作为校园管理工作的重要一环,不仅关系到学生自身的确切利益,同时也是对校园管理工作重大考验。近来年由于在校学生…

ECMAscript6学习

ECMAscript6介绍 ECMA是一个浏览器脚本标准制定的公司,Netscape 创造了 JavaScript 由于商标原因, 后面ECMA公司取名ECMAscript 1 发布,JavaScript 也就是 ECMAscript.到现在最新的版本是6,简称es6. 新增let 与const let 与const …