简单请求 VS 预检请求 preflight

简介: 简单请求 VS 预检请求 preflight

简单请求

符合以下特征的 HTTP 请求为简单请求

  1. HTTP 请求方法为 GET 或 HEAD 或 POST

HTTP 请求方法一共有 9 种 :

序号 方法 描述
1 GET 从服务器获取信息
2 HEAD 从服务器获取报头
3 POST 向服务器传递信息,如提交表单/上传文件,数据被包含在请求体中,通常用于新增/修改数据库中的数据
4 PUT 传递新数据取代服务器的旧数据
5 DELETE 删除服务器的数据
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
7 OPTIONS 查看服务器的性能
8 TRACE 回显服务器收到的请求,主要用于测试或诊断
9 PATCH 对 PUT 方法的补充,用来对已知资源进行局部更新

(加粗的为最常见的请求方式)

【面试题】GET和POST有什么区别?

1.GET在浏览器回退时是无害的,而POST会再次提交请求。

2.GET产生的URL地址可以被Bookmark,而POST不可以。

3.GET请求会被浏览器主动cache,而POST不会,除非手动设置。

4.GET请求只能进行url编码,而POST支持多种编码方式。

5.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

6.GET请求在URL中传送的参数是有长度限制的,而POST么有。

7.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。.

8.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

9.GET参数通过URL传递,POST放在Request body中。
  1. Content-Type 的值为 text/plain 或 multipart/form-data 或 application/x-www-form-urlencoded

Content-Type 表示HTTP请求中传递信息的数据类型,可取值为:

  • text/html: HTML格式
  • text/plain:纯文本格式
  • text/xml: XML格式
  • image/gif:gif 图片格式
  • image/jpeg:jpg 图片格式
  • image/png:png 图片格式
  • application/json:JSON数据格式
  • application/pdf:pdf格式
  • application/msword:Word文档格式
  • application/octet-stream: 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded: 表单提交数据的格式
  • application/xhtml+xml:XHTML格式
  • application/xml: XML数据格式
  • application/atom+xml:Atom XML聚合格式
  • multipart/form-data: 表单中上传的文件的媒体格式类型

(加粗的为最常见的四种值)

  1. 没有自定义的 Header

预检请求 preflight

如果 HTTP请求不属于上述的简单请求,浏览器就会先自动使用 HTTP的 OPTIONS 方法向服务器发出一个预检请求,用于检查服务器是否支持CORS(Cross-Origin Resource Sharing,跨域资源共享)。

当服务器响应预检请求,告诉客户端其支持CORS后,才会正式发起原计划的HTTP请求。

流程图如下:

预检请求中同时携带了下面两个首部字段:

Access-Control-Request-Method: POST  // 告知服务器,实际请求将使用 POST 方法
Access-Control-Request-Headers: X-PINGOTHER, Content-Type // 告知服务器,实际请求将携带两个自定义请求首部字段:X-PINGOTHER 与 Content-Type。

服务器将据此决定,该实际请求是否被允许。

如流程图中的范例,服务器对预检请求的响应为

Access-Control-Allow-Origin: https://foo.example // 仅支持来自域名https://foo.example 的HTTP请求
Access-Control-Allow-Methods: POST, GET, OPTIONS // 仅支持 POST, GET, OPTIONS 三种HTTP请求方法
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type // 允许请求头包含字段 X-PINGOTHER, Content-Type 
Access-Control-Max-Age: 86400 // 有效期为 86400 秒,即 24 小时

在有效期内,浏览器不会对同一请求再次发起预检请求。

浏览器自身也维护了一个有效期,与服务器返回的有效期想比较,以较短的有效期为准。

目录
相关文章
|
缓存
POST 为什么会发送两次请求?
POST 为什么会发送两次请求?
844 0
|
17天前
|
缓存 安全 数据安全/隐私保护
如何根据请求场景选择 GET 或 POST 请求方法?
【10月更文挑战第27天】根据不同的请求场景,综合考虑数据传输目的、安全性、数据量大小、幂等性要求以及缓存需求等因素,合理地选择GET或POST请求方法,能够更好地实现客户端与服务器之间的数据交互,提高系统的性能和安全性。
118 64
|
2天前
|
缓存 安全
预检请求(Preflight Request)
预检请求(Preflight Request)
|
11天前
|
开发框架 中间件 Java
如何处理跨域资源共享(CORS)的 OPTIONS 请求?
处理 CORS 的 OPTIONS 请求的关键是正确设置响应头,以告知浏览器是否允许跨域请求以及允许的具体条件。根据所使用的服务器端技术和框架,可以选择相应的方法来实现对 OPTIONS 请求的处理,从而确保跨域资源共享的正常进行。
常见的请求状态码
常见的请求状态码
|
2月前
|
JSON 安全 前端开发
post为什么会发送两次请求?
post为什么会发送两次请求?
99 12
|
4月前
|
缓存 JavaScript 前端开发
浏览器处理预检请求的响应
浏览器处理预检请求的响应
|
3月前
|
JSON 数据格式 开发者
preflight 错误,但服务端告诉你已经设置过了 CORS 信息怎么办
preflight 错误,但服务端告诉你已经设置过了 CORS 信息怎么办
|
5月前
|
XML 安全 前端开发
post为什么会发送两次请求详解
【6月更文挑战第5天】在Web开发中,开发者可能会遇到POST请求被发送了两次的情况,
190 0