【前端进阶学习】非简单请求特别之处:预检请求

82 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

前情提要:非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUTDELETE,或者Content-Type字段的类型是application/json

特别之处:什么是预检请求

非简单的CORS请求,会在正式通信前,增加一次HTTP 查询请求,主要是为了确认当前网页所在域名是否在许可名单里&可以加HTTP哪些头信息字段

让我们来模仿走一遍吧!

举例:

1、浏览器脚本里有HTTP请求

var url = 'http://api.alice.com/cors';
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xhr.setRequestHeader('X-Custom-Header', 'value');
xhr.send();

//举例参考:http://www.ruanyifeng.com/blog/2016/04/cors.html

2、这时候浏览器发现,诶,这是一个非简单请求,因为HTTP请求用的是PUT 那么,就需要自动发一个“预检请求”

3、发送预检请求

OPTIONS /cors HTTP/1.1
Origin: http://api.bob.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

//举例参考:http://www.ruanyifeng.com/blog/2016/04/cors.html

"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

我们发现"预检"请求的头信息有包括两个特殊字段。

(1)Access-Control-Request-Method 用来列出浏览器的CORS请求会用到哪些HTTP方法(举例里说的是PUT

(2)Access-Control-Request-Headers

4、确认回应

服务器收到预检,并检查了字段之后,就确认可以允许啦,并发送回应

5、否定回应

如果否定,不允许呢?

如果服务器否定了"预检"请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段

浏览器就会认定,服务器不同意预检请求,因此触发一个错误

写在最后

重新开始更文啦!最近忙了一段时间,终于继续可以学习!感谢大家的支持!我会继续努力坚持学习!养成了好习惯,每天必定会抽出时间多多少少学习前端知识~

以上习题&笔记从大佬们的论坛学习而来,特感谢大佬们的知识分享~ (学习技术知识,果然要看大佬们的技术博客,大家有好的推荐也欢迎指引我这个小白哈,感恩!)

附上学习链接,感谢这些大佬出题和解答: