网络编程 - HTTP协议

目录

HTTP协议格式

 一,请求格式

1.1 URL的基本格式

1.2 方法(method)

1.3 请求头header 

 二,响应格式

2.1 状态码


HTTP协议格式

HTTP协议与之前讲的TCP/IP协议不同,HTTP协议要分为两个部分——请求和响应,也就是一种"一问一答" 结构模型的协议。

如何查看HTTP协议请求和响应的协议?在这里使用的是一款叫Fiddler的抓包工具。

 一,请求格式

1. 首行

请求的第一行,由三个部分组成,使用空格分开:

1)GET,HTTP请求的"方法"(method)

2)URL,唯一资源定位符,描述一个资源在网络上的位置,具体由什么构成下面再说。

3)版本号, HTTP/1.1

2.请求头(header)

是一个键值对结构的数据(可以有多组),每一个键值对都占一行,键和值之间使用:空格 来区分

3.空行

请求头header的结束标记

4.正文(body)

有的HTTP请求有,有的没有,上面的图就没有

1.1 URL的基本格式

url在计算机中十分重要,它不仅仅在HTTP中涉及,在Java中的jdbc设置数据源setUrl也使用过。URL是用来描述一个资源在网络上的所处位置。

  • 协议方案名:不必多说,类似的还有https://
  • 登录信息:现在几乎不会使用了
  • 服务器地址:可以是IP地址,也可以是域名
  • 服务器端口号:通过IP地址可以找到是哪台主机,但是一台主机可能有多个服务器程序,使用端口号来区分是哪个程序。这里的端口号可能会省略,例如:对于http请求,如果省略,就默认访问80端口;对于https请求,如果省略,就默认访问443端口。
  • 文件路径:描述你要访问服务器的哪个资源,这个看上去有点像目录结构,但实际上,服务器不一定是以目录形式来存储数据。
  • 查询字符串(query string) :一种键值对结构的数据,是以?开头,可以有多个键值对,键值对之间使用&来分割,键和值使用=来分割。(注意:这里的键值对是有程序员自己定义的,不像header中的键值对是有标准规定的)
  • 片段标识符:可以通过这个来实现页面的跳转,有点类似于看小说时,点章节名,就能跳转到那个章节。

注意:对于query string 来说,如果 value 部分要包含一些特殊符号的话,往往需要进行 urlencode操作,有点类似于转义字符。比如:+ ?:/ 等这些符号在url中有特殊用途,如果在value中使用,可能会使浏览器对于url的识别出现问题。所以要对这些符号进行"转义",+就要写成%2B。另外所有的中文都要转义。

1.2 方法(method)

方法说明
GET获取资源
POST传输实体主体

PUT

传输文件
HEAD获得报文首部
DELETE删除文件
OPTIONS询问支持的方法
TRACE追踪路径
CONNECT要求用隧道协议连接代理
LINK建立和资源之间的联系
UBLIKE断开连接的关系

这里最常用的方法只有两个—— GET和 POST,所以主要介绍这两种方法的区别:

  1. 这两种方法没有本质上的区别,但在使用习惯上,还是存在一些差异:GET经常把传递到服务器的数据放到 query string 中;POST 则是经常将数据放到 body 中。(注意:GET也可以使用body中,POST也可以使用 query string,但是使用的前提是服务器/客户端都是按照一样的方式处理,不能一边使用query string,另一边使用 body)
  2. 语义上的差异:GET大部分是用来获取数据;POST大部分是用来提交数据(比如:登录和上传操作)

这里还有一些错误说法需要区分:

  1. GET请求能传递的数据是有上限的,POST请求能传递的数据是无上限的。✖             该说法是一个"历史遗留"问题,因为早期的浏览器硬件资源匮乏,针对GET请求的URL长度做出了限制,而实际上RFC文档没有明确规定URL的长度,就目前来说,URL的长度也可以非常长。
  2. GET请求传递的数据不安全,POST请求传递的数据更安全。✖                                   错误的依据 :使用GET实现登录,点击登录会使用户名和密码放到url中,进一步显示到浏览器地址栏里,就会被人看到;而POST则是在body中,不会在界面上显示出来,所以更安全。                                                                                                                    但是实际上那些黑客也能通过抓包工具获取到body,通常来说,“安全”是指你传递的数据不容易被黑客获取,或者获取到之后不容易被破解。因为我们的密码会进行加密,所以即使黑客拿到也不容易破解。所以此处的安全与POST无关,关键在于加密。
  3. GET只能传递文本数据,POST可以传递文本和二进制数据。✖                                      1)GET也可以使用body,body中是可以放二进制                                                          2)GET也可以通过base64转码将二进制数据转换成文本数据,放到query string中
  4. GET是幂等的,POST不是幂等的。(不完全正确)                                                        幂等是指输入相同的值,输出的值都是一样的。而GET和POST是否幂等,这取决于它们的代码是如何实现的。只不过RFC文档建议GET幂等。
  5. GET可以缓存,POST不可以缓存。(不完全正确)                                                        这也取决于是否幂等,如果幂等则可以缓存

1.3 请求头header 

这里的键值对有很多,这里挑一些重要的讲一下:

1.)host:表示服务器主机地址和端口

2)Content-Length:body中的数据长度

3)Content-Type:body中的数据格式

body中的格式有很多种:

请求中:1. json 2. form表单格式 3. form-data格式...

响应中:1. html 2. css 3. js 4. json 5. 图片....

4)User-Agent:描述你使用什么设备上网

5)Referer:描述当前页面是从哪个页面跳转过来的

6)Cookie

浏览器在本地存储数据的一种机制,浏览器中的数据来自服务器,但是在程序运行过程中也是有一些数据需要在浏览器这边存储,并在下次访问时再发给服务器,比如说,上次访问时间,用户身份信息,累计访问次数....这些临时数据都存储在浏览器。

但是为什么不把这些数据存储在本地文件中呢?这是因为浏览器考虑到安全性,禁止网页直接访问你电脑中的文件系统,造成你自身用户数据的泄露。为了保证安全性,又能进行数据存储,所以引入了Cookie(实际上也是按照硬盘文件的方式存储,但是浏览器把操作文件给封装了,网页只能往Cookie中存储键值对,也就是字符串)。

Cookie往往是从服务器返回的数据(也可以是网页自己生成的)

Cookie存储到浏览器所在的主机的硬盘上,并且按照域名来存储(每一个域名多可以存自己当Cookie,彼此之间互不影响)

Cookie是按照键值对的形式来组织的,这里的键值对也是程序员自定义的,后续再请求这个服务器的时候,就会把 Cookie中内容自动昂带入到请求中,发给服务器,服务器通过 Cookie的内容做一些逻辑上的处理。

 二,响应格式

 1. 首行

1)版本号 HTTP/1.1

2)状态码(200)描述请求的结果

3)状态码描述(OK)

2.响应头(header)

也是一个键值对结构的数据(可以有多组),每一个键值对都占一行,键和值之间使用:空格 来区分。

3.空行

4.正文(body)

正文内容可能很长,也有很多种格式,比如:HTML,CSS,JS,JSON,XML,图片,字体....,响应也可以没有正文,看情况。

2.1 状态码

 这里重点讲一些常见的状态码:

  • 2XX:表示成功,200最常见
  • 3XX:表示重定向,比如:一个网站更换了网址,就可以给旧网址挂一个重定向响应,访问旧网址时就会自动跳转到新网站。 301表示永久重定向;302表示临时重定向。
  • 4XX:表示请求报错。404表示访问的资源在服务器上不存在;403表示访问的资源没有权限。
  • 5XX:表示服务器出错了。

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

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

相关文章

路由器基础(九):防火墙基础

防火墙 (Fire Wall) 是网络关联的重要设备,用于控制网络之间的通信。外部网络用户的访问必须先经过安全策略过滤,而内部网络用户对外部网络的访问则无须过滤。现在的防火墙还具有隔离网络、提供代理服务、流量控制等功能。 一、三种防火墙技术 常见的…

云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准

随着各行业数字化转型需求的不断提高,人工智能、云计算、大数据等新技术的应用已不仅仅是一个趋势。各行业企业和组织纷纷投入大量资源,以满足日益挑剔的市场需求,追求可持续性和竞争力,这也让运维行业迎来了前所未有的挑战和机遇…

Git Rebase 优化项目历史

在软件开发过程中,版本控制是必不可少的一环。Git作为当前最流行的版本控制系统,为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性,它可以用来重新整理提交历史,使之更加清晰和线性。本文将详细介绍g…

FFmpeg——使用Canvas录制视频尚存问题的解决方案

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

creating server tcp listening socket 127.0.0.1:6379: bind No error

window下启动redis服务报错: creating server tcp listening socket 127.0.0.1:6379: bind No error 解决方案如下按顺序输入如下命令即可连接成功 redis-cli.exeshutdownexit运行:redis-server.exe redis.windows.conf shutdown出现以下错误&#xff…

Type-C接口详解

USB接口发展史 USB接口历经Type-A→Type-B→Type-C五次大的更新换代;目前Type-A Standard作为标准USB接口形式,仍然在大范围应用,而Micro-A以及Type-B系列已经慢慢谈出人们的视野,逐渐被新型的Type-C代替。 Type-C接口 24PIN Typ…

路由器基础(十一):ACL 配置

访问控制列表 (Access Control List,ACL) 是目前使用最多的访问控制实现技术。访问控制列表是路由器接口的指令列表,用来控制端口进出的数据包。ACL适用于所有的被路由协议,如IP、IPX、AppleTalk 等。访问控制列表可以分为基本访问控制列表和高级访问控制…

Redis之哨兵模式

文章目录 前言一、主从复制1.概述2.作用3.模拟实践搭建场景模拟实践 二、哨兵模式1.概述2.配置使用3.优缺点4.sentinel.conf完整配置 总结 前言 从主从复制到哨兵模式。 一、主从复制 1.概述 主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Red…

UE5——源码阅读——1

UE启动 hInInstance :项目实例 hPrevInstance:项目上一个实例 pCmdLine:参数 nCmdShow:窗口显示 TRACE_BOOKMARK(TEXT(“WinMain.Enter”));:UE用来追踪记录的函数,用于标记应用程序在执行过程中一些特定的…

Git 使用

Git 使用 目录 Git 使用一、命令行操作0. 配置用户名邮箱1. 初始化一个新的 Git 仓库2. 从远程仓库克隆一个仓库3. 添加文件到暂存区4. 提交更改到本地仓库5. 拉取/推送代码6. 分区操作​7. 其他查看操作8.基本操作流程 二、idea/pycharm操作1、 集成git2、 idea添加项目3、 fe…

网络工程师进阶课:华为HCIP认证课程介绍

微思网络HCIP VIP试听课程:DHCP协议原理与配置https://www.bilibili.com/video/BV1cy4y1J7yg/?spm_id_from333.999.0.0 【赠送】IT技术视频教程,白拿不谢!思科、华为、红帽、数据库、云计算等等 https://xmws-it.blog.csdn.net/article/det…

2.2整式的加减(第1课时)——合并同类项教学及作业设计

【学习目标】 1.理解同类项的概念,并能正确辨别同类项. 2.理解合并同类项的依据是乘法分配律,掌握合并同类项的方法. 知识点归纳: ★合并同类项后,所得的项的系数是___________…

docker部署elk

目录 前言 一、创建程序工作路径 二、创建私有网络 三、部署elasticsearch 1.先搜速后下载 2.创建一个基础的容器(此步骤是为了拷贝容器里的文件) 3.拷贝文件到宿主机 3.1进入容器 3.2拷贝并授权 3.3删除基础容器 4.创建容器 5.访问9200测试 …

【java学习—十三】处理流之三:标准输入输出流(3)

文章目录 1. 相关概念2. 举例与练习2.1. 举例2.2. 练习 1. 相关概念 System.in 和 System.out 分别代表了系统标准的输入和输出设备,默认输入设备是键盘,输出设备是显示器。     System.in 的类型是 InputStream     System.out 的类型是 PrintS…

C++进阶篇4---set和map

一、关联式容器 在初阶篇中,我们已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。 那什么是关联式容器&#xff1…

【算法挨揍日记】day19——62. 不同路径、63. 不同路径 II

62. 不同路径 62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#x…

14.1 Linux 并发与竞争

一、并发与竞争 并发:多个执行单元同时、并行执行。 竞争:并发的执行单元同时访问共享资源(硬件资源和软件上的全局变量等)易导致竞态。 二、原子操作 1. 原子操作简介 原子操作:不能再进一步分割的操作,一般用于变量或位操作。 …

AI:53-基于机器学习的字母识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

latex自定义缩写

Latex 写文章可能常用到一些缩写,如: .e.g.i.e.cf.etc.w.r.t.i.i.d.et al. 其中有些要斜体,如果每次都要用 \textit{...}、{\it ...} 弄斜,有点麻烦。CVPR 模板中有定义一些命令,可以更方便地输入这些缩写。这里记录…