简单请求 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 小时

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

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

目录
相关文章
|
9月前
|
缓存
POST 为什么会发送两次请求?
POST 为什么会发送两次请求?
580 0
|
缓存 前端开发 UED
304状态码详解(协商缓存)
304状态码详解(协商缓存)
3469 0
|
2月前
发送带cookie的请求
发送带cookie的请求
32 1
|
18天前
|
XML 安全 前端开发
post为什么会发送两次请求详解
【6月更文挑战第5天】在Web开发中,开发者可能会遇到POST请求被发送了两次的情况,
28 0
|
11月前
|
小程序
小程序接口请求配置
小程序接口请求配置
157 0
|
2月前
|
人工智能 前端开发 安全
post为什么会发送两次请求?
post为什么会发送两次请求?
|
8月前
GoWeb获取请求
GoWeb获取请求
37 1
|
8月前
|
网络协议 安全
[javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)
[javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)
[javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)
|
7月前
Axios 权限请求 一次只能发送一个请求
Axios 权限请求 一次只能发送一个请求

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    26
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    24
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    20
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19