简单了解 HTTP 基础知识

embedded/2024/9/22 19:43:22/

HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于在网络上传输数据的一种协议,对于网络开发人员来说,理解这一协议是至关重要的。由于其广泛的应用,除了在网页应用传输数据之外,它还被应用于物联网(IoT)中的数据和命令传输。

HTTP 协议的第一个版本只有一个方法,即 GET,用于从服务器请求页面。服务器的响应总是一个 HTML 页面。要了解 HTTP 协议最初的简单设计,请参阅原始规范,该规范文档仅有一页。

从最初的 0.9 版本开始,HTTP 已经发展了几个版本。当前的版本是 1.1,并于 2014 年最后一次修订。

工作原理

HTTP 作为互联网协议之一,它是基于文本的命令和响应协议,使用客户端-服务器通信模型。

HTTP 协议基础https://img-blog.csdnimg.cn/img_convert/aea2202cbc9000f655df35ce4d26cbc9.jpeg" width="438" />

客户端发出请求,服务器做出响应。HTTP 协议是无状态协议,意味着服务器不需要存储会话信息,每个请求都是独立的。更多信息

这意味着:

  • 所有请求来自客户端(如您的浏览器)。
  • 服务器对请求作出响应。
  • 请求(命令)和响应均为可读文本格式。
  • 请求彼此独立,服务器不需要跟踪请求。

请求与响应结构

请求和响应的消息结构相同,如下所示:

HTTP 请求响应结构https://img-blog.csdnimg.cn/img_convert/d667053d39f62648e5e8892c7dbca0fb.jpeg" width="597" />

一个请求包括:

命令或请求 + 可选的头部 + 可选的内容体

一个响应包括:

状态码 + 可选的头部 + 可选的内容体

使用简单的 CRLF(回车和换行)组合来分隔各部分,单独的空行(CRLF)表示头部结束。

如果请求或响应包含消息体,则这一情况在头部中表明

消息体的存在通过内容长度(Content-Length)传输编码(Transfer-Encoding) 头域来信号化。请求消息的构架与方法语义无关,即使该方法没有定义任何消息体的用途。 – 参见 RFC 7230第 3.3 节。

请注意:消息体后不跟随 CRLF。参见 RFC 7230 第 3.5 节

HTTP 请求详解

我们之前已经看到了一般的请求和响应格式,现在我们将更详细地介绍请求消息。

起始行是必须的,其结构如下:

方法 + 资源路径 + 协议版本

例如,如果我们尝试访问 www.testsite5.com 上的网页 testpage.htm,请求的起始行将是:

GET /test.htm HTTP/1.1

其中:

  • GET 是方法
  • /testpage.htm 是资源的相对路径
  • HTTP/1.1 是我们使用的协议版本

注释:

  1. 相对路径不包括域名。
  2. Web 浏览器使用我们输入的 URL 来创建资源的相对 URI

注意:  URL(统一资源定位符)用于网页,它是URI(统一资源标识符)的一个例子。

浏览器实际上不显示 HTTP 请求,只能通过特殊工具如 http header live(Firefox)  查看。

HTTP 与 URL

大多数人熟悉在 Web 浏览器中输入 URL。通常看起来像这样:

URL 示例https://img-blog.csdnimg.cn/img_convert/f15500acf07df0c7a3fa6d9cfaf14f57.jpeg" width="478" />

URL 还可以包含通常由浏览器隐藏的端口,但您可以手动包括它,如下图所示:

带端口的URL示例https://img-blog.csdnimg.cn/img_convert/e9a8771fbdbafb2bb113159ab6a6b36c.jpeg" width="480" />

这告知网页浏览器资源的地址以及检索资源所使用的协议 (HTTP)

HTTP 是从服务器到客户端传输资源(网页、图片、视频等)的传输协议。

HTTP 响应和响应代码

每个请求都有一个响应。响应包括:

  • 状态码描述
  • 一个或多个可选的头部
  • 可选的消息主体,可以包括多行,甚至二进制数据

响应状态码分为 5 组,每组有其含义和三位数字代码:

  • 1xx – 信息性
  • 2xx – 成功
  • 3xx – 多种选择
  • 4xx – 客户端错误
  • 5xx – 服务器错误

例如,一个成功的页面请求将返回一个 200 响应码,一个不成功的请求将返回一个 400 响应码。

您可以在这里找到完整的列表及其含义。

请求响应示例

我们将检查访问简单网页(testpage.htm)时的请求和响应。

这是我在浏览器地址栏中输入的:

浏览器请求https://img-blog.csdnimg.cn/img_convert/bb46883522b64d5f6218df4c3d90a0e5.jpeg" width="477" />

这是浏览器显示的响应:

浏览器响应https://img-blog.csdnimg.cn/img_convert/6cec626f538d6c7ff1fdd6c1d18392e2.jpeg" width="316" />

以下是幕后发生的 HTTP请求-响应 的屏幕截图:

图片.pnghttps://img-blog.csdnimg.cn/img_convert/6915cc2e0d283d5bcf4f32c1203a47d6.png" width="519" />

注意,浏览器自动插入请求头,同样地,Web 服务器也自动插入响应头。请求中没有正文内容。响应中的正文内容是网页,在浏览器中显示,并不由实时头部工具显示。

请求类型

到目前为止,我们还未提及请求类型,但我们在示例中已经见到了 GET 请求类型。

GET 请求 类型或方法用于从 Web 服务器请求资源。GET 是最常用的请求类型,并且是原始 HTTP 规范中唯一的请求类型。

请求类型、方法或动词

HTTP 协议现在支持 8 种请求类型,也称为方法或动词,它们是:

  • GET – 从服务器请求资源
  • POST – 向服务器提交资源(例如,文件上传)
  • PUT – 与 POST 相似,但用于替换资源
  • DELETE – 从服务器删除资源
  • HEAD – 类似 GET,但只返回头部而不返回内容
  • OPTIONS – 获取资源的选项
  • PATCH – 对资源应用修改
  • TRACE – 执行消息回环

在今天的 Internet 上,GET(获取网页)和 POST(提交 Web 表单)方法是最常使用的。

其他方法在与 Web 和物联网 APIs 工作时使用,尤其是 PUT、DELETE 和 HEAD。

  • 源于:Introduction to HTTP : Understanding HTTP Basics

http://www.ppmy.cn/embedded/7043.html

相关文章

Linux应用开发(8):Linux进程间通信(IPC):管道

Linux应用开发(7):Linux进程间通信(IPC):POSIX消息队列https://blog.csdn.net/tecsai/article/details/137879465 1. 简述 我们在前面已经介绍了进程间通信(IPC)常用的“消息队列”…

微服务分布式缓存:无法反序列化 Cannot deserialize;

问题描述 在拆分SpringBoot项目搭建微服务的过程中,需要配置分布式缓存,对redis进行配置,配置完成后,在启动Knife4j文档界面时报错,发现是redis无法反序列化的问题,但是报错中所指出的类com.jhin.jhinoj.m…

GO环境及入门案例

文章目录 简介一、win GO开发环境安装二、Linux go运行环境二、GO代码入门2.1 导包案例2.2 赋值2.3 变量、函数2.4 三方库使用 简介 go不是面向对象语言, 其指针、结构体等比较像C,知名的go 开源项目有docker k8s prometheus node-exporter等 一、win …

百度文心一言与谷歌Gemini的对比

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 本文从多角度将百度文心一言与谷歌Gemini进行对比。因为不同评测基准的侧重点和难度可能有所不同,所以本文涉及到的评测结果仅供参考。Gemini和文心一言都是非常…

sqlite

SQLite是一种轻量级的嵌入式数据库引擎,它被广泛应用于移动设备、嵌入式系统和桌面应用程序等领域。最近,SQLite在以下几个方向上有了新的发展: 1. 支持JSON数据类型:SQLite 3.9版本引入了对JSON数据类型的支持,使得开…

装饰器学习

【一】什么是装饰器 装饰器指的就是为被装饰的对象添加新的功能 器 代表工具 增加后的调用方式不变 在不改变源代码和调用方式的基础上增加额外的新功能 【二】装饰器的用途 对上线后的程序进行新功能的增加和修改 给一个功能增加新的需求或者改变原来的程序运行逻辑 【…

【Linux】应用层协议:HTTP

URL 在之前的文章中我们实现了一个网络版本的计算器,在那个计算器中揉合了协议定制以及序列化反序列化的内容,我们当时也自己定制了一套协议标准,比如请求和响应的格式应该是什么?如何读到一个完整的报文?支持的运算符…

Flask 解决指定端口无法生效问题

问题重现 手动指定的IP端口是app.run(host0.0.0.0, port9304),但是启动的地址显示的却是http://127.0.0.1:5000。 if __name__ __main__:app.run(host0.0.0.0, port9304)启动地址如下: 解决方案 PyCharm会自动识别出来flask项目(即使你…