什么是 HTTP 请求中的 options 请求?
在 Chrome 开发者工具中的 Network 面板看到的 HTTP 方法 OPTIONS,其实是 HTTP 协议的一部分,用于客户端和服务器之间进行“预检”或“协商”。OPTIONS 请求的作用是让客户端能够获取关于服务器支持的 HTTP 方法和其他跨域资源共享 (CORS) 相关的信息,尤其是在跨域请求中,浏览器会自动发出 OPTIONS 请求,确认服务器是否允许该请求的实际执行。

OPTIONS 请求经常用于以下几种场合:
1. 跨域资源共享 (CORS) 的预检请求
当客户端尝试对一个与当前源不同的服务器发起跨域 HTTP 请求时,如果该请求包含复杂的 HTTP 方法(比如 PUT、DELETE)或使用了一些特殊的请求头(如 Authorization),浏览器会自动先发出 OPTIONS 请求,检查服务器是否允许该请求。这个过程称为预检请求 (Preflight Request)。通过预检,浏览器可以在发送实际的 HTTP 请求之前,确保服务器接受该请求,避免不必要的数据传输。
以 CORS 预检为例,假设你的前端应用托管在 https://www.example.com,但你需要从后端 https://api.example.com 获取数据,前端会自动发出一个 OPTIONS 请求,以确保后端允许跨域请求。这个 OPTIONS 请求通常包括两个重要的请求头:
Access-Control-Request-Method:指定实际请求使用的 HTTP 方法,例如POST、PUT。Access-Control-Request-Headers:列出实际请求中包含的自定义头部信息,比如Authorization。
下面是一个例子:

服务器响应 OPTIONS 请求时,需要返回以下头部信息:
Access-Control-Allow-Origin:指定允许的源。Access-Control-Allow-Methods:列出允许使用的 HTTP 方法。Access-Control-Allow-Headers:列出允许的自定义头部。
下面是一个例子:

2. 请求服务器支持的 HTTP 方法
OPTIONS 请求也可以被用来询问服务器支持哪些 HTTP 方法。一个典型的场景是,当客户端需要与服务器进行交互时,不确定服务器支持哪些操作(如 GET、POST、PUT 等),此时可以发起 OPTIONS 请求,获取服务器支持的 HTTP 方法列表。
这在 API 开发过程中非常有用。假设你正在开发一个前端应用,连接到不同的 RESTful API,你可以通过 OPTIONS 请求确认服务器允许使用的 HTTP 动作。服务器的响应中可能包含 Allow 头部信息,告诉客户端支持的 HTTP 方法,例如:
Allow: GET, POST, PUT, DELETE
这意味着服务器允许客户端通过这几种方法与其进行交互。
3. OPTIONS 请求的真实场景举例
以一个常见的跨域请求为例,假设我们有以下前端和后端环境:
- 前端:
https://www.frontend.com - 后端:
https://www.backend.com
前端需要发起一个 PUT 请求更新某个资源,但由于跨域限制,浏览器会先发出 OPTIONS 请求以确保服务器允许跨域。
客户端发出的 OPTIONS 请求:
OPTIONS /resource/123 HTTP/1.1
Host: www.backend.com
Origin: https://www.frontend.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type, Authorization
这个请求包含了 Origin,表明请求的来源,以及 Access-Control-Request-Method,告知服务器实际请求的方法是 PUT。还包含了 Access-Control-Request-Headers,告诉服务器实际请求中会包含 Content-Type 和 Authorization 这两个自定义请求头。
服务器的响应:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://www.frontend.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
这个响应告诉浏览器,服务器允许来自 https://www.frontend.com 的跨域请求,并且支持 GET、POST 和 PUT 三种方法,还允许使用 Content-Type 和 Authorization 头部。Access-Control-Max-Age 指定了预检请求的缓存时间,在此时间内,浏览器可以直接发送实际的请求,而无需再次发出 OPTIONS 请求。
实际的 PUT 请求:
预检成功后,浏览器将发送实际的 PUT 请求:
PUT /resource/123 HTTP/1.1
Host: www.backend.com
Origin: https://www.frontend.com
Content-Type: application/json
Authorization: Bearer some-token{"name": "Updated Resource"
}
这个请求更新了服务器上的资源 /resource/123,并且包含了 Authorization 头部来携带身份验证令牌。
4. OPTIONS 请求在浏览器内部的处理机制
浏览器对 OPTIONS 请求的处理是完全自动化的,尤其是在处理 CORS 场景时,浏览器会自行决定是否发出 OPTIONS 请求,并处理服务器的响应。浏览器的渲染引擎与网络模块会紧密配合,确保跨域请求的安全性,避免跨域攻击。
假设你在 Chrome 中使用开发者工具查看网络请求,你可以通过点击某个 OPTIONS 请求,查看详细的请求和响应头信息。这有助于调试跨域问题,了解服务器是否正确配置了 CORS 头部。如果没有正确处理,浏览器会阻止实际请求的发送,并在控制台抛出跨域错误。
5. OPTIONS 请求对前端开发的影响
在现代前端开发中,尤其是单页面应用 (SPA) 和前后端分离的架构中,跨域请求非常常见。为了确保这些请求顺利进行,开发者需要了解并正确配置服务器的 CORS 头部信息。浏览器会根据服务器返回的 Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers 等信息来决定是否允许实际请求。
例如,如果你在前端使用了 fetch API 或 axios 发送请求,并遇到了跨域问题,可以检查 OPTIONS 请求的响应,确认服务器是否正确配置了跨域策略。常见的错误场景包括:
- 服务器没有返回
Access-Control-Allow-Origin头部,导致浏览器阻止请求。 - 实际请求使用了自定义头部,但服务器没有在
Access-Control-Allow-Headers中允许这些头部。
这些问题都可以通过分析 OPTIONS 请求的响应来解决。你可以在开发环境中通过 Chrome 的开发者工具来调试,确保请求和响应都符合预期。
6. OPTIONS 请求的性能影响
虽然 OPTIONS 请求在 CORS 场景中扮演了重要角色,但它也会增加一次网络往返请求,可能会影响应用的性能。尤其是在高频请求的场景下,每次请求都触发 OPTIONS 请求会带来显著的延迟。
为了解决这个问题,可以通过设置 Access-Control-Max-Age 头部,告知浏览器在一定时间内缓存预检请求的结果。这样,浏览器在缓存时间内可以直接发送实际的请求,而不需要再次发出 OPTIONS 请求。例如,以下头部指示浏览器缓存预检请求的结果 86400 秒(24 小时):
Access-Control-Max-Age: 86400
这对于频繁与同一服务器交互的前端应用非常有用,可以有效减少 OPTIONS 请求的频率,提升应用性能。
7. 在开发过程中使用 OPTIONS 请求
开发者在调试 API 请求时,可能会忽略 OPTIONS 请求的存在。然而,在跨域和 RESTful API 开发中,理解 OPTIONS 请求的机制至关重要。无论你是在前端调试 API 请求,还是在服务器端配置 CORS 规则,都需要特别留意 OPTIONS 请求的响应,确保其头部信息正确无误。
总结
OPTIONS 请求作为 HTTP 方法中的一种,扮演着极为重要的角色,尤其是在跨域请求和 API 开发中。它为客户端提供了与服务器进行沟通和协商的手段,使得前后端的交互更加安全和灵活。开发者需要对 OPTIONS 请求的工作原理有清晰的理解,特别是在 CORS 场景下,通过正确配置服务器的 CORS 头部,可以确保前端应用的稳定运行。
相关文章:
什么是 HTTP 请求中的 options 请求?
在 Chrome 开发者工具中的 Network 面板看到的 HTTP 方法 OPTIONS,其实是 HTTP 协议的一部分,用于客户端和服务器之间进行“预检”或“协商”。OPTIONS 请求的作用是让客户端能够获取关于服务器支持的 HTTP 方法和其他跨域资源共享 (CORS) 相关的信息&am…...
[图形学]smallpt代码详解(1)
一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍,和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…...
Vite多环境配置与打包:
环境变量必须以VITE开头 1.VITE_BASE_API: 在开发环境中设置为 /dev-api,这是一个本地 mock 地址,通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA: 设置为 "true",表示启用调试工具,通常是为了…...
git维护【.gitignore文件】
在工程下添加 .gitignore 文件【git忽略文件】 *.class .idea *.iml *.jar /*/target/...
【Canvas与色彩】十六等分多彩隔断圆环
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>隔断圆环Draft5十六等分多彩</title><style type"text…...
什么是pip? -- Python 包管理工具
前言 不同的编程语言通常都有自己的包管理工具,这些工具旨在简化项目的依赖管理、构建过程和开发效率,同时促进代码的复用和共享。每个包管理工具都有其独特的特点和优势,开发者可以根据自己的编程语言和项目需求选择合适的包管理工具。 pip是…...
FastAPI框架使用枚举来型来限定参数、FastApi框架隐藏没多大意义的Schemes模型部分内容以及常见的WSGI服务器Gunicorn、uWSGI了解
一、FastAPI框架使用枚举来型来限定参数 FastAPI框架验证时,有时需要通过枚举的方式来限定参数只能为某几个值中的一个,这时就可以使用FastAPI框架的枚举类型Enum了。publish:December 23, 2020 -Wednesday 代码如下: #引入Enum模块 from fa…...
OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,当初有的问题未解决,目前新版未尝试
OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,有的问题未解决,新版未尝试 1、前言—安装单副本单节点集群1.1 docker安装OB 2、查看现有集群情况2.1 进入容器&#x…...
前沿论文创新点集合
系列文章目录 文章目录 系列文章目录一、《LAMM: Label Alignment for Multi-Modal Prompt Learning》二、《MaPLe: Multi-modal Prompt Learning》三、《Learning to Prompt for Vision-Language Models》CoOp四、《MobileCLIP: Fast Image-Text Models through Multi-Modal R…...
刷题记录(好题)
Problem - D - Codeforces 思路: 滑动窗口思想,一个数组记录起始点(记录出现过的次数),另一个数组记录截至点(记录出现过的次数),从0开始遍历,设定一个长度为d的滑动窗口…...
【大数据入门 | Hive】函数{单行函数,集合函数,炸裂函数,窗口函数}
1. 函数简介: Hive会将常用的逻辑封装成函数给用户进行使用,类似于Java中的函数。 好处:避免用户反复写逻辑,可以直接拿来使用。 重点:用户需要知道函数叫什么,能做什么。 Hive提供了大量的内置函数&am…...
python sqlite3 工具函数
起因, 目的: sqlite3 最常用的函数。 比如,某人给了一个 database.db 文件。 但是你登录的时候,不知道账号密码。 此文件就是,查看这个数据库的详细内容。 有哪些表某个表的全部内容。添加数据 代码, 见注释 impor…...
顺丰Android面试题集锦及参考答案
TCP 三次握手和四次挥手是什么,挥手过程中主动方的状态是什么? TCP 三次握手是建立连接的过程: 第一次握手:客户端向服务器发送一个 SYN 报文,该报文包含客户端的初始序列号(seq=x)。此时客户端进入 SYN_SENT 状态。第二次握手:服务器收到客户端的 SYN 报文后,向客户端…...
uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app
uniapp一个很是用的功能,就是在我们发布新版本的app后,需要提示用户进行app更新,并告知用户我们新版的app更新信息,以使得用户能及时使用上我们新开发的功能,提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…...
Python爬虫通过 Cookie 和会话管理来维持其在网站上的会话状态
Python 爬虫虽然是一个热门且非常实用的技术领域,但在实际开发中,确实存在一些困难的地方。以下是 Python 爬虫开发中常见的难点和挑战: 1. 处理反爬虫机制 许多网站为防止爬虫的恶意访问,采取了各种反爬虫措施。常见的反爬虫技…...
使用STM32单片机实现无人机控制系统
无人机控制系统是无人机的大脑,负责处理无人机的姿态控制、导航和通信等功能。本文将详细介绍如何使用STM32单片机实现无人机控制系统,包括硬件设计、软件设计、系统调试与测试等内容。 一、系统概述 无人机控制系统通常包括飞行控制器、传感器、执行器…...
【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)
将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路,请移步:https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能:可同时绕X轴和Y轴旋转,两者效果会叠加。 完美适配Web、原生…...
解决nginx+tomcat宕机完美解决方案
问题描述:公司项目太老了,还是tomcat项目,部署两台tomcat,做了nginx负载。最近发现每到上午10,下午3点,tomcat就宕机了,死活找不到原因,客户影响超期差,实在让人头疼。 解决思路&am…...
第十一章 缓存之更新/穿透/雪崩/击穿
目录 一、什么是缓存 二、缓存更新策略 2.1. 缓存主动更新策略 2.1.1. Cache Aside模式(主流) 2.1.2. Read/Write Through模式 2.1.3. Write Behind模式 2.1.4. 总结 三、缓存穿透 四、缓存雪崩 五、缓存击穿 5.1. 互斥锁实现 5.1.1…...
一款完全开源并免费的监测与分析系统,支持监测,预警,分析,报告,支持本地化部署(附源码)
前言 在当今这个信息爆炸的时代,企业和个人都需要时刻了解网络上的动态,以便及时了解自身品牌形象和社会舆论的变化。然而,现有的舆情监测工具往往价格昂贵,且cao作复杂,难以满足普通用户的需求。 在这种背景下&…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
