-
在做项目的过程中经常会遇到跨域的问题,但是如果每次改了都要发到服务器上去调试,那是一件很麻烦的事情,那么有什么好的解决方法吗?当然是有的通过postman可以解决这个问题
通过postman中header添加相关的参数就能看到是否解决问题:
一般来说我们只需要用到post和get,但是如果后端是ResetFul设计规范下就需要用到各种语义化的方法了
预请求就是复杂请求(可能对服务器数据产生副作用的HTTP请求方法,如put,delete都会对服务器数据进行修改,所以要先询问服务器)。
跨域请求中,浏览器自发的发起的预请求,浏览器会查询到两次请求,第一次的请求参数是options,以检测试实际请求是否可以被浏览器接受
w3c规范要求,对复杂请求,浏览器必须先使用options发起一个预检请求,从而获知服务器是否允许该跨域请求,服务器确认以后才能发起实际的HTTP请求,否则停止第二次正式请求。
那为什么我们不常见options请求呢??
因为大部分我们使用的是get,post请求,他们属于简单请求,而简单请求不会触发options请求。
那什么情况下会发生options请求呢???👇
例如设置了post请求的content-type:application/json,就会发生预请求
ajax发送复杂的json数据结构, 处理方式困难, 服务器端难以解析, 所以就有了application/json这种类型(数据格式的声明) 服务端好解析并且比较统一,如果你请求中没有设置成json格式的,有的服务端收到后也会改成json格式的,但是如果请求中就改成了json格式的就会发生options预请求
if设置了:
if没设置:
在 CORS 中,可以使用 OPTIONS 方法发起一个预检请求,服务器基于从预检请求获得的信息来判断,以检测实际请求是否可以被服务器所接受。
1.预请求的请求报文中要设置👇
2.同时服务端或者nginx 需要设置响应体👇
"Access-Control-Allow-Origin" : * 【跨域】 Access-Control-Allow-Methods:POST,GET,OPTIONS,DELEDET 【所允许的请求方法告知客户端】 Access-Control-Allow-Headers: X-Requested-With, accept, origin, content-type【自定义的请求头】 Access-Control-Allow-Age:3600 【一段时间内不需要再次预请求,直接用本次结果即可】 "Content-Type", "application/json;charset=utf-8"
OPTIONS请求方法的主要用途有两个:
在 cors 中会有 简单请求
和 复杂请求
的概念。
不会触发 CORS 预检请求。这样的请求为“简单请求”,请注意,该术语并不属于 Fetch (其中定义了 CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:
情况一: 使用以下方法(意思就是以下请求以外的都是非简单请求)
GET
HEAD
POST
情况二: 人为设置以下集合外的请求头
Accept
Accept-Language
Content-Language
Content-Type
(需要注意额外的限制)
DPR
Downlink
Save-Data
Viewport-Width
Width
情况三:Content-Type
的值仅限于下列三者之一:(例如 application/json 为非简单请求)
text/plain
multipart/form-data
application/x-www-form-urlencoded
情况四:
请求中的任意XMLHttpRequestUpload
对象均没有注册任何事件监听器;XMLHttpRequestUpload
对象可以使用 XMLHttpRequest.upload
属性访问。
情况五:
请求中没有使用 ReadableStream
对象。
除以上情况外的。
1、 在新版的 chrome 中,如果你发送了复杂请求,你却看不到 options
请求。可以在这里设置 chrome://flags/#out-of-blink-cors
设置成 disbale
,重启浏览器。对于非简单请求就能看到 options
请求了。
2、 一般情况下后端接口是不会开启这个跨域头的,除非是一些与用户无关的不太重要的接口。
未完待续……
最后我把请求head的
“Content-Type”, “application/json”
改为
“Content-Type”, “multipart/form-data;”
这样没有了option预请求。
nginx下添加了请允许跨域请求
然后在postman中测试
postman调试跨域问题
在做项目的过程中经常会遇到跨域的问题,但是如果每次改了都要发到服务器上去调试,那是一件很麻烦的事情,那么有什么好的解决方法吗?当然是有的通过postman可以解决这个问题
通过postman中header添加相关的参数就能看到是否解决问题:
看返回的请求参数据就知道了:
如果说你解决了跨域的问题: