Http基础之http协议、无状态协议、状态码、http报文、跨域-cors

Http基础

  • HTTP基础
    • HTTP协议
      • 请求方法
      • 持久连接
      • 管线化
    • 无状态协议
      • 使用Cookie状态管理
    • 状态码
      • 1XX
      • 2XX OK
        • 200 OK
        • 204 NO Content
        • 206 Content-Range
      • 3XX 重定向
        • 301
        • 302
        • 304
        • 307
      • 4XX
        • 400
        • 401
        • 403
        • 404
      • 5XX
        • 500
        • 503
    • HTTP报文
      • 请求报文
      • 响应报文
      • 通用首部字段
        • Cache-Control
        • Connection
        • Date
        • 请求首部字段
          • Accept
          • Accept-Charset
          • Accept-Charset
          • Accept-Encoding
          • Accept-Language
          • Host
          • If-Match
          • If-Modified-Since
          • If-None-Match
            • Referer
          • User-Agent
        • 响应首部字段
          • Accept-Ranges
          • Age
          • Location
          • Server
        • 实体首部字段
          • Allow
          • Content-Encoding
          • Content-Language
          • Content-Type
          • Expires
          • Last-Modified
    • 跨域-cors
      • 两种请求
        • 简单请求
          • 浏览器不同的处理方式
        • 非简单请求

HTTP基础

HTTP协议

HTTP- Hyper Text Transfer Protocl 超文本传输协议
对我们的客户端和服务端值之间数据之间实现传输(文字、图片、音频、视频等等)

客户端 => 服务端通信

  • 客户端:请求访问文本资源的一端
  • 服务端: 提供资源响应的一端

HTTP协议规定:客户端发起请求、服务端回复响应
先从客户端建立通信、服务端在没有接收通信之前不发送响应

属于应用层 第一层HTTP

请求方法

  • GET 一获取资源
  • POST - 传输实体主体
    • 虽然GET也可以传输实体主体,但是一般我们不用
  • PUT传输文件
  • HEAD -获取报文首部
    • HEAD 不返回报文主体部分
  • DELETE 一删除文件
  • OPTION -预检请求
  • TRACE 一 追踪路径

持久连接

HTTP请求在应用层,核心通道基于TCP连接
页面有很多的图片,在发送请求访问HTML,也可能包含其他的资源、所以我们每一次请求都要建立一次TCP的链接和断开增加了通信量的开销

过去的http连接:
在这里插入图片描述
建立TCP连接:三次握手
断开TCP连接:四次挥手

Http1.1中:Connection:Keep-Alive
Connection:代表TCP信道的链接
只要任意一端没有明确提出端口链接,则保持TCP连接状态
(建立一次TCP链接,可以一次性的发送所有http请求)
在这里插入图片描述
好处:减少了TCP链接的重复建立以及我们断开链接的开销、减轻了服务器的负载、提高了运行速度
HTTP 1.1 默认就是持久连接

如何区分http用的是同一个TCP信道?
connectionID(连接ID)相同的是同一个TCP信道
connectionID:标识 标识单个请求新建立信道索引
在这里插入图片描述

管线化

并行发送多个请求,不是一个一个等着响应
在这里插入图片描述

无状态协议

http协议就是一种无状态协议,不保存状态
不对请求和响应之间的通信状态进行保存
目的:更快的处理大量事务、确保协议的可伸缩性

使用Cookie状态管理

引入cookie
服务端 set-Cookie 通知客户端保存Cookie
客户端下一次在进行发送的时候,会将之前设置的cookie进行携带
性能: cookie 每次请求都会携带,性能受到影响
跨域:cookie无法跨域调用,需要指定一个作用域

状态码

负责客户端HTTP请求的返回结果

当客户端向服务器发送请求时候,描述返回的请求结果。能够知道服务端是正常除了请求,还是有错误

1XX

信息性状态码
作用:接收的请求正在处理中

2XX OK

Success -成功状态码
表示请求处理正常且成功

200 OK

表示从客户端发来的请求在服务端进行正常处理了

204 NO Content

表示服务器接收的请求已经成功处理,但是返回的响应报文中不包含实体的主体部分,而且不返回任务实体的主体
场景:从客户端发送请求给服务端,对客户端不需要发送新信息内容的情况

206 Content-Range

表示客户端进行了范围请求
Content-Range

3XX 重定向

表示浏览器需要执行某些特殊的处理以及正确处理请求

301

永久性重定向:请求该资源时候每次都返回一个新的url

302

临时性重定向:请求该资源时候每次都返回一个新的url,可能只限于本次
代表资源不是被永久移动,只是临时的。

304

表示发送一些附带条件的请求。

加上一些附带的条件
if-Match, if-Modified-since ,if-Range

虽然是3xx系列,但是和重定向没啥关系

307

临时重定向:期望客户端保持请求方法不变,向新的地址发出请求

4XX

客户端错误

400

表示请求报文中存在语法错误
错误发生、需要修改请求的内容然后重新发送,浏览器会像200 对待

401

表示需要有通过HTTP认证的认证信息

403

表示对请求资源的访问被服务器拒绝了。而且没有必要给出拒绝的详细理由。如果想说明,则在主体返回

404

无法找到请求的资源

5XX

服务器本身发生了错误

500

表示服务器在执行请求的时候发生了错误

503

服务器超负载了处理停机维护状态

HTTP报文

  • 报文首部 一客户端和服务器处理是的请求或者响应的内容以及属性
  • 报文主体 -应该被发送的数据

请求报文

客户端的HTTP报文
请求行 - 方法、URL \HTTP版本
首部字段:

  • 请求
  • 通用
  • 实体

响应报文

服务器的HTTP报文

状态行一HTTP版本、状态码

首部字段:

  • 响应首部字段
  • 通用首部字段
  • 实体首部字段

HTTP首部字段类型

  • 通用首部字段-请求报文和响应报文 都会使用的首部
  • 请求首部字段 一 从客户端向服务器发送请求报文时使用的首部
  • 响应首部字段一从服务器向客户端返回响应报文使用的首部
  • 实体首部字段 —请求报文 和响应报文使用的首部

通用首部字段

Cache-Control

能操作缓存的工作机制

  • public 表明其他用户可以利用缓存
  • private 只以特定的用户作为对象
    public private 相反
  • no-cache一防止从缓存中返回过期的资源,缓存服务器转发给源服务器
    在这里插入图片描述
Connection

作用:

  • 控制不在转发给代理的首部字段
    connection:不在转发的首部字段 Hop-by-hop
  • 管理持久连接
    • connection:close - 服务器明确的断开链接
    • connection: Keep-Alive- 持久连接
Date

表明创建http报文的日期和时间

请求首部字段

作用: 补充一些请求的附加信息、客户端信息、对响应内容相关的优先级等

Accept

能够处理的媒体类型以及媒体类型的优先级

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
  • 文本文件
    • text/html - HTML格式 text/plain-纯文本格式,text/css -css格式
    • 组合application/xhtml+xml,application/xml,application/json ,application/pdf
  • 图片文件
    • image/jpeg - jpeg 格式,image/webp,image/apng image/png,image/gif
  • 视频
    • video/mpeg,video/quicktime
  • 应用程序中使用的二进制文件
    • application/octet-stream, application/zip,application/x-www-form-urlencoded

q=0.9 权重
范围0~1可以精确到小数点后3位
1为最大值、默认为1.0

accept—期望,提供给服务端的一些参考意见

Accept-Charset

期望支持的字符集优先级

Accept-Charset

期望支持的字符集 优先级
http
Accept-Charset: charset = utf-8

Accept-Encoding

期望支持的内容编码,被压缩的
包装
好处:减少网络流程,提升我们的性能

  • gzip
  • compress
  • deflate
    -br
  • identity - 不执行压缩或者不会发生变化的默认编码格式

注:
我们在要求服务器按照某种方式返回,但是这不是强制。如果说服务器不支持或者不开启,那么不起作用
如果服务器支持压缩,或者开启,响应报文的Content-Encoding 告知

Accept-Language

期望能够处理的语言集
zh-CN,zh;q=0.9,en;q=0.8

Host

Host:
www.baidu.com
请求资源所处的互联网主机名和端口号
唯一一个必须要包含在请求内的首部字段
相同的IP地址下部署了多个域名,那么服务器就无法知道哪一个域名对应的请求。

If-Match

像If-xxx 条件请求。服务器接收到附带的条件的请求后,只有判断指定条件为真,才会执行请求
If-Match: “12345”
两端资源进行比较,只有判断条件为真才会接收请求

If-Modified-Since

如果服务器If-Modified-Since 早于资源的更新时间,希望能处理请求
不满足条件的话,服务器返回304代码

If-None-Match

实体标记(ETag) 值和请求资源的ETag的值不一致的时候,告诉服务器处理请求

Referer

告诉服务器,请求的原始资源的地址

User-Agent

客户端的信息传给服务器了
内容包含:操作系统/版本 、浏览器/版本、设备信息(移动端)/版本

响应首部字段

用于补充响应的附加信息、服务器信息、对客户端的附加要求

Accept-Ranges

告诉客户端,我服务器是否可以接受范围请求,是bytes,否none

Age

资源在代理缓存中存在的时间

Location

客户端重定向的URL

Server

服务器的名字:Apache Nginx BWS gws

实体首部字段
Allow

资源的正确请求方式:GET HEAD POST
服务器接收到了不支持的HTTP方法,会以状态码405

Content-Encoding
  • gzip
  • compress
  • deflate
  • br
Content-Language

告诉客户端,用的哪一种语言

Content-Type

说明了实体主题内对象的媒体类型
text/html charset=utf-8

Expires

资源失效的日期

缓存服务器 如果接收到了这个字段,会以缓存来应答,如果在这个时间之前,响应的副本会一直保存
如果超过了这个时间,会转发给服务器

如果源服务器不希望缓存服务器对资源进行缓存,那么这个时间设置为Date相同的时间即可。

Last-Modified

指明资源在最后修改的时间

跨域-cors

Cors => 跨域资源共享
同源策略:端口、域名、协议

跨域构成条件:

  • 端口不同
  • 协议不同
  • 域名不同
    三个只要一个不同,就是不同源。只要不同源,就是跨域

两种请求

简单请求

两个条件:

  1. 请求方法是:HEAD,GET,POST
  2. header中只能包含以下请求字段:
  3. Accept
  4. Accept-Language
  5. Content-Language
  6. Content-Type
  7. text/plain
  8. multipart/form-data
  9. application/x-www-form-urlencoded
浏览器不同的处理方式

简单请求跨域,浏览器会让请求发出

GET /cors HTTP/1.1
Origin: http://www.baidu.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0 ...

响应头会加Access-Control-Allow-Origin,表示对该来源的请求是允许的

Access-Control-Allow-Origin: http://www.baidu.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type:text/html; charset=utf-8
  1. Access-Control-Allow-Origin是必须的
    要么是请求时,Origin的值。
    那么就是 * => 表示接受任意域名的请求但是存在安全隐患
    如果没有这个头部信息,说明了服务器没有开启资源共享,浏览器会认为这次请求失败
  2. Access-Control-Allow-Credentials是可选的
    表示允许发送Cookie
    true: 表示服务器明确许可,可以在请求中一起发送
    如果不要浏览器发送cookie那么删掉
非简单请求

只要不是简单请求,那就是非简单请求

先发送OPTIONS 预检请求
OPTIONS请求按照简单请求的方式处理
目的: 保护客户端的安全,防止不受信任的网站利用用户的浏览器向其他网站发送恶意请求

  • Access-Control-Request-Method:告诉服务器实际发送的HTTP请求方法
  • Access-Control-Request-Header:告诉服务器实际请求所携带的自定义的头部信息
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:IS0-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://www.baidu.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers:X-PINGOTHER,Content-Type

服务器根据这些信息决定,该请求是否被允许
响应的

Access-Control-Allow-Methods:POST
Access-Control-Allow-Headers:X-PINGOTHER,Content-Type

什么时候触发OPTIONS请求?

  1. 跨域的时候,Access-Control-Request-Headers: X-PINGOTHER,Content-Type
  2. 发送跨域的时候,使用PUT、DELETET、CONNECT、OPTIONS、TRACE、PATCH

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM 第四部分—垃圾回收相关概念 2

System.gc() 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存 然而System.gc()调用附带一个免责声明,无法保证对垃…

博途PLC 面向对象系列之“双通气缸功能块“(SCL代码)

1、面向对象系列之找对象 https://rxxw-control.blog.csdn.net/article/details/136150027https://rxxw-control.blog.csdn.net/article/details/1361500272、博途PLC 面向对象系列之"单通气缸功能块" https://rxxw-control.blog.csdn.net/article/details/1363399…

Spark(1)-wordCount入门

1. 创建Maven项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

JavaScript继承 寄生组合式继承 extends

JavaScript继承 1、JS 的继承到底有多少种实现方式呢? 2、ES6 的 extends 关键字是用哪种继承方式实现的呢? 继承种类 原型链继承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…

三天学会阿里分布式事务框架Seata-seata事务日志mysql持久化配置

锋哥原创的分布式事务框架Seata视频教程&#xff1a; 实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;共计10条视频&…

上位机图像处理和嵌入式模块部署(当前机器视觉新形态)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 过去的机器视觉处理&#xff0c;大部分都是集中在上位机、或者是服务器领域&#xff0c;这种形式维持了很长的时间。这种业务形态下&#xff0c;无…

windows 11 蓝牙突然消失

解决方法&#xff1a; 1.WinX&#xff0c;点击设备管理器 2.选中蓝牙&#xff0c;右键更新驱动。 3.然后就可以出现了&#xff0c;如下图

程序员是如何看待“祖传代码”的?

目录 ​编辑 程序员是如何看待“祖传代码”的&#xff1f; 一、什么是“祖传代码”&#xff1f; 二、“祖传代码”的利弊 1. 可以节省开发成本 2. 可能引入安全隐患 3. 可能增加系统的维护难度 三、祖传代对程序员的影响 1. 丰富程序员的技能和知识 2. 提高程序员的创…

Python——Tchisla求解器(暴力搜索法)

Tchisla简介 最近玩到一个挺有意思的数字解密小游戏《Tchisla》&#xff0c;其规则类似算24点&#xff0c;也是利用一些数学运算和初始数字计算出目标数字&#xff0c;与算24点不同的是&#xff0c;Tchisla允许不限次数地使用一种初始数字&#xff08;1~9&#xff09;&#xf…

【VSCODE修改代码行间距】解决方案

在我们编码的过程中&#xff0c;由于显示字体和显示器的不同&#xff0c;会需要调整行间距&#xff0c;在vscode默认的选项中没有看到设定行间距的选项&#xff0c;不过&#xff0c;可以手动修改配置档达到目的。 1.打开设置 2.打开配置档&#xff0c;手动进行设定 3.在选项中添…

第七十二天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第72天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

带你玩转java封装和继承(上)

上次带大家学习了java里面比较重要的知识点类和对象&#xff0c;而且我们知道java是一门面向对象的语言&#xff0c;有时一个程序里可能有很多类&#xff0c;那么这么多类他们之间有什么联系吗&#xff1f;今天就带大家学习一下java类之间的关系。 什么是继承&#xff1a; 我们…

Linux信号【systemV】

目录 前言 正文&#xff1a; 1消息队列 1.1什么是消息队列&#xff1f; 1.2消息队列的数据结构 1.3消息队列的相关接口 1.3.1创建 1.3.2释放 1.3.3发送 1.3.4接收 1.4消息队列补充 2.信号量 2.1什么是信号量 2.2互斥相关概念 2.3信号量的数据结构 2.4…

蓝桥杯-单片机组基础5——外部中断与LED的控制(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

自学软件测试怎么学?

软件测试是一个变得越来越受欢迎的行业&#xff0c;在IT行业里面&#xff0c;也是初学比较容易的。但对小白而言&#xff0c;怎样学习才能做到快速入门&#xff0c;少走弯路呢&#xff1f; 步骤一&#xff1a;初学学软件测试&#xff0c;要先搞懂这种问题 要想进入到软件测试…

Android Duplicate class 排除重复类

一、起因&#xff1a; 在迭代开发的时候&#xff0c;发现2个ijk很多类重复。但又2个库实现的功能是不一样&#xff0c;目前不能合并。但又想保留2个功能。需要排除其中一个库。 二、报错如何下图&#xff1a; 三、解决方法&#xff1a; 3.1 在terminal 也就是命令行处输入 …

在Windows 11中运行磁盘清理工具的9种方法,总有一种适合你

自Windows98以来,微软在操作系统中包含了一个内置的清理工具。当用户转向第三方清理应用程序时,这个值得信赖的实用程序站稳了脚跟。微软甚至宣布,第三方应用程序几乎毫无用处,删除注册表项不是一个好主意。 磁盘清理工具可以帮助删除临时文件、旧的更新日志、缩略图缓存和…

git安装与使用4.3

一、git的安装 1、下载git包 下载git包url&#xff1a;https://git-scm.com/download/win 下载包分为&#xff1a;64位和32位 2、点击安装包 2、选择安装路径 3、 点击下一步 4、点击next 5、点击next 6、点击next 7、 8、 9、 10、 11、 12、在桌面空白处&#xff0c;右键…

【SpringBoot】测试单元使用多线程

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 问题产生 今天学习了乐观锁&#xff0c;但在测试单元执行多线程的时候出现了问题&#xff0c;多线程并没有直接结果 在控制台没有任何输出…

KubeSphere平台安装系列之二【Linux单节点部署KubeSphere】(2/3)

**《KubeSphere平台安装系列》** 【Kubernetes上安装KubeSphere&#xff08;亲测–实操完整版&#xff09;】&#xff08;1/3&#xff09; 【Linux单节点部署KubeSphere】&#xff08;2/3&#xff09; 【Linux多节点部署KubeSphere】&#xff08;3/3&#xff09; **《KubeS…