简单请求
符合以下特征的 HTTP 请求为简单请求
- 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中。
- 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: 表单中上传的文件的媒体格式类型
(加粗的为最常见的四种值)
- 没有自定义的 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 小时
在有效期内,浏览器不会对同一请求再次发起预检请求。
浏览器自身也维护了一个有效期,与服务器返回的有效期想比较,以较短的有效期为准。