HTTP—02

embedded/2024/12/27 5:04:30/

方法(method)

方法说明支持的HTTP协议版本
GET获取资源1.0  1.1
POST传输实体主体1.0  1.1
PUT传输文件1.0  1.1
HEAD获得报文首部1.0  1.1
DELETE删除文件1.0  1.1
OPTION询问支持的方法1.0
TRACE追踪路径1.0
CONNECT要求用隧道协议连接代理1.0
LINK建立和资源之间的联系1.0
UNLINE断开连接关系1.0

上述HTTP请求的初心是为了,表示不同的“语义”

但是在使用的过程中,不一定严格按照上述的标准,比较随意

GET 是最常用的 HTTP 方法 . 常用于获取服务器上的某个资源
在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求
另外 , HTML 中的 link, img, script 等标签 , 也会触发 GET 请求
GET 请求的特点
首行的第一部分为 GET
URL query string 可以为空 , 也可以不为空
header 部分有若干个键值对结构
body 部分为空

POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面)

通过 HTML 中的 form 标签可以构造 POST 请求 , 或者使用 JavaScript ajax 也可以构造 POST 请求
POST 请求的特点
首行的第一部分为 POST
URL query string 一般为空 ( 也可以不为空 )
header 部分有若干个键值对结构
body 部分一般不为空 . body 内的数据格式通过 header 中的 Content - Type 指定 . body 的长度由header 中的 Content - Length 指定

PUT POST 相似,只是具有幂等特性,一般用于更新

DELETE 删除服务器指定资源
OPTIONS 返回服务器所支持的请求方法
HEAD 类似于 GET ,只不过响应体不返回,只返回响应头
TRACE 回显服务器端收到的请求,测试的时候会用到这个
CONNECT 预留,暂无使用
任何一个能进行网络编程的语言都可以构造 HTTP 请求 . 本质上就是通过 TCP socket 写入一个符合 HTTP 协议规则的字符串

在方法中,GET 和 POST 占据了大多数,所以以下就针对这两种方法进行介绍:

GET请求,通常会把要传递给浏览器的数据,加到URL的query string中

POST请求,通常把要传给服务器的数据,加到body中                        ——以上都是习惯用法

浏览器显示的网页,是从服务器这边下载过来的,HTML内容可能比较多,通过网络加载消耗的时间比较多

浏览器一般会自带缓存,把之前加载过的数据,保存到本地网盘上

如要传输图片等数据,一般要进行 base64 转码——>针对二进制数据重新编码(转义),确保编码之后的数据就是纯文本数据

GET 和 POST 的错误描述——>

1)GET请求能传递的数据量有上限,POST请求传递的数据量没有上限

该说法是一个“历史遗留”问题

早期版本的浏览器(硬件资源匮乏),针对GET请求的长度做出了限制

实际上,RFC标准文档中并没有明确URL的最大长度

目前浏览器和服务器的实现过程中,URL可以非常长(以至于可以使用URL传递图片等)

2)GET请求传递数据不安全,POST请求传递数据安全

依据是:使用GET请求来实现登录,会把用户名和密码放到URL中,进而显示在浏览器的搜索地址里。相比之下,POST则是把数据放在body里面

——>所谓的安全不是,传递的数据不容易被获取,而是在获取后不容易被破解(加密)

3)GET只能给服务器传输文本数据,POST可以给服务器传输文本数据和二进制数据

1. GET也可以使用body(body是可以直接放二进制数据的)

2. GET也可以把二进制的数据进行 base64 转码,放到URL的query string中

以下是关于GET和POST较为模棱两可的论述:

1)GET请求是幂等的,POST请求不是幂等的

任何情境下,输入相同的内容,输出的是稳定的

GET和POST是否是幂等的取决于代码的实现(RFC标准文档建议GET请求是幂等的)

2)GET请求可以被浏览器缓存,POST不可以缓存

幂等性的延续,如果请求是幂等的,就可以缓存

3)GET请求可以被浏览器收藏夹收藏,POST不能(收藏时可能丢失body)

请求报头(header)

header 的整体的格式也是 " 键值对 " 结构
每个键值对占一行 . 键和值之间使用分号分割

Header中的键值对很多,以下是比较重要的几个:

Host

表示服务器主机的地址和端口(在URL中也是存在的)
在使用代理的时候,Host的内容可能和URL中的值不同

Content-Length  Content-Type

Content-Length  body中的数据长度

Content-Type     body中的数据格式

请求中有body,才会有这两个属性

通常情况下,GET请求没有body,POST请求有body

body中的格式,可以选择的方式有很多:

请求:

1. json

2. form表单的格式    相当于是把GET的query string给挪到了body中

3. form-data的格式    上传文件时,会涉及到(不一定是form-data,也可能是form表单)

响应:

1. html        构成网页的骨架

2. css         构成网页的样式

3. json        

4. js            构成网页的行为

5. 图片

... 

TCP涉及到“粘包”问题,HTTP在传输层就是基于TCP

使用同一个TCP连接,传输多个数据包。此时就会使多个HTTP数据包,在TCP接收缓冲区挨在一起。接收方解析时,就需要清除HTTP数据包之间的边界 

GET请求没有body,直接使用  空行(分隔符)

POST请求有body,结合  空行  和  Content-Length

后续给服务器提交请求的时候,不同的Content-Type,服务器处理数据的逻辑是不同的

服务器返回数据给浏览器,也需要设置合适的Content-Type,浏览器也会根据不同的Content-Type做出不同的处理

User-Agent(UA)

表示浏览器/操作系统的属性

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/91.0.4472.77 Safari/537.36
Windows NT 10.0 ; Win64 ; x64 表示操作系统信息
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 表示浏览器信息

Referer

表示这个页面是从哪个页面跳转过来的
如果直接在浏览器中输入 URL, 或者直接通过收藏夹访问页面时是没有 Referer

Cookie

浏览器的数据来自服务器,浏览器的后续操作也是要提交给服务器的

服务器这边管理了一个网站的各种核心数据

程序运行过程中,也会需要一些数据,需要在浏览器储存,在后续请求的过程中可能会发给服务器(这些临时性的数据,存储在浏览器比较好)但是禁止网页直接访问电脑的文件系统——>

于是为保证安全,又能进行保存数据,引入了Cookie(按照硬盘文件的方式进行保存,但是浏览器把操作文件封装了,网页只能往Cookie里储存键值对)——>Cookie 中存储了一个字符串

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

2)Cookie存储到浏览器所在的主机的硬盘上,按照域名为维度来存储(每个域名下可以存自己的Cookie,彼此之间互不影响)

3)Cookie是按照键值对的形式组织的(此处的键值对是自定义的)

键值对之间,使用  ;  分割          键和值之间,使用  =  分割

后续再请求这个服务器的时候,会把Cookie中的内容自动带入到请求中,发给服务器。服务器通过Cookie的内容做一些逻辑上的处理

状态码

1XXInformational(信息性状态码)接受的请求正在处理
2XXSuccess        (成功状态码)请求正常处理完毕
3XXRedirection   (重定向状态码)需要进行附加操作以完成请求
4XX

Client Error   (客户端错误

状态码)

服务器无法处理请求
5XX

Server Error  (服务器错误

状态码)

服务器处理请求出错

 3XX    请求中访问的是A的地址,响应返回了一个重定向的报文,告诉你要访问B地址

很多时候网页的跳转就是使用重定向来实现

重定向的响应报文中,会带有Location字段,描述出当前要跳转到哪个字段

404    Not Found  请求中访问的资源,在服务器上不存在

403    Forbidden  访问的资源没有权限


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

相关文章

python脚本实现csv中百度经纬度转84经纬度

数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84

在 Ubuntu 下通过 Docker 部署 PSQL 服务器

嗨,各位技术爱好者!今天我们要聊的是如何在 Ubuntu 系统中通过 Docker 部署 PostgreSQL(简称 PSQL)服务器。对于那些还不熟悉 Docker 和 PSQL 的小伙伴,Docker 是一个开源的容器化平台,可以让你轻松构建、部…

Excel粘贴复制不完整的原因以及解决方法

在数据处理和分析的过程中,Excel无疑是不可或缺的工具。然而,在使用Excel进行复制粘贴操作时,有时会遇到粘贴不完整的情况,这可能会让人感到困惑和烦恼。本文将深入探讨Excel粘贴复制不完整的原因、提供解决方案,并给出…

C:\Windows 文件夹

在Windows操作系统中,C:\Windows 文件夹是一个非常重要的系统文件夹,它包含了Windows操作系统的核心文件和组件。主要子文件夹: System32: 包含了大多数Windows系统的可执行文件和动态链接库(DLL)文件。 SysWOW64: 在6…

易语言 OCR 文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

API部署大模型

由于生产测试环境的服务器配置较低 不能够支撑大模型运行的配置 所以需要将大模型封装部署在A服务器上 在B服务器上进行调用 封装时可以使用FastAPI与Websocket两种通信方式进行通信 Websocket 在A服务器端部署大模型(服务端) import asyncio import …

【自留】Unity VR入门

帮老师写的,自留,不保证是很好的教程。 1.PICO开发指南(官方) 在该页面,能找到大部分能实现的功能,以及实现方式。非常推荐!PICO Unity Integration SDK | PICO 开发者平台 2.如何快速入门&…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出,可以让开发者轻松地对实时数据进行处理,比如计数、聚合、…