简单请求

符合以下特征的 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请求。

流程图如下:

简单请求 VS 预检请求 preflight_xml

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

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 小时

在有效期内,浏览器不会对同一请求再次发起预检请求。
浏览器自身也维护了一个有效期,与服务器返回的有效期想比较,以较短的有效期为准。