前端在向后端发送 GET 请求,会多个 OPTIONS 请求,由于 OPTIONS 的时间和 GET 的时间接近,所以想优化它,让它只做一次 GET 请求。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue-Test</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
</head>
<body>
<div id="app">
{{ info }}
</div>
<script type = "text/javascript">
axios.defaults.headers.common['source'] = 'test';
var url = "https://api.rvhqs.com/v1/home_search_rv_detail/?vehicle_id=661&pickup_branch_id=387&start_date=2019-12-29&end_date=2020-01-01&return_branch_id=387&start_time=10:00&end_time=10:00"
new Vue({
el: '#app',
data () {
return {
info: null
}
},
mounted () {
axios
.get(url)
.then(response => (this.info = response))
.catch(function (error) { // 请求失败处理
console.log(error);
});
}
})
</script>
</body>
</html>
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_PREFLIGHT_MAX_AGE = 2592000
CORS_ALLOW_HEADERS = default_headers + (
'source',
)
1
yeept 2019-12-27 16:51:01 +08:00
可以使用 nginx 配置在一个域下,使用 CORS 的话还是会有 OPTIONS 请求
|
2
IMCA1024 2019-12-27 16:53:26 +08:00
有点奇怪欸,为什么不从根本上解决这个接口时间问题。。。。。。
|
3
ai277014717 2019-12-27 16:56:13 +08:00
OPTIONS 是用来检查跨域权限的。收敛 url host 可解决吧。
|
4
Chingim 2019-12-27 16:57:49 +08:00
1. 过早优化是万恶之源.
2. 数据可以放 params 里, 不一定要放 Header 里, 也可以放 body |
5
HanMeiM 2019-12-27 16:58:25 +08:00
- -先去看看跨域吧
|
6
HanMeiM 2019-12-27 17:00:18 +08:00
哦,骚凹瑞,没看中间部分。
把 token 什么的放到 header 头里面,可以不用放 url,只要 url 没变是不会触发 options 的 |
7
jinliming2 2019-12-27 23:03:17 +08:00 via iPhone
1,网关层拦截所有 OPTIONS 请求,直接返回跨域授权信息,不要让 OPTIONS 请求进到业务代码里。
2,遵从同源策略部署代码,当然这得看实际情况。 3,将请求变为简单请求,不要使用特殊的 header 头,参数完全可以放在 query 参数或是 path 中。 |
8
qq450255457 OP @yeept 经过 google 查找后,通过 NGINX 把前后端置于一个域下,确实解决了 OPTIONS 请求的问题,谢谢。
|
9
qq450255457 OP @IMCA1024 该 API 接口耗时 75ms,加了个 OPTIONS 请求差不多 150ms.所以您说的接口是指什么呢?
|
10
qq450255457 OP @ai277014717 收敛 url host?
|
11
qq450255457 OP 由于后端每个接口都需要参数 source,方便跟踪请求来源,那么你会把 source 放 body 中吗?
|
12
qq450255457 OP @jinliming2 您这是三种解决办法吗?
|
13
jinliming2 2019-12-30 15:58:24 +08:00 via iPhone
@qq450255457 是的,你 8 楼的解决方案就是我说的第二种,遵从同源策略,放到同一个域名下。
你 9 楼的问题,加了 OPTIONS 请求时间翻倍,说明 OPTIONS 请求进入了业务逻辑,也就是没有区分 OPTIONS 请求和 GET 请求,导致业务处理了两遍。就是我说的第一种方案,网关层直接拦截 OPTIONS 请求返回跨域许可,这样服务端耗时就几乎为 0 了,只剩下一次请求来回的耗时。(当然,也有可能是其他原因) |