讨教 HTTP 中 OPTIONS 请求的优化?

2019-12-27 16:42:43 +08:00
 qq450255457

问题发现场景

前端在向后端发送 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>

Django 后端 CORS 配置

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_PREFLIGHT_MAX_AGE = 2592000
CORS_ALLOW_HEADERS = default_headers + (
    'source',
)
2788 次点击
所在节点    程序员
13 条回复
yeept
2019-12-27 16:51:01 +08:00
可以使用 nginx 配置在一个域下,使用 CORS 的话还是会有 OPTIONS 请求
IMCA1024
2019-12-27 16:53:26 +08:00
有点奇怪欸,为什么不从根本上解决这个接口时间问题。。。。。。
ai277014717
2019-12-27 16:56:13 +08:00
OPTIONS 是用来检查跨域权限的。收敛 url host 可解决吧。
Chingim
2019-12-27 16:57:49 +08:00
1. 过早优化是万恶之源.
2. 数据可以放 params 里, 不一定要放 Header 里, 也可以放 body
HanMeiM
2019-12-27 16:58:25 +08:00
- -先去看看跨域吧
HanMeiM
2019-12-27 17:00:18 +08:00
哦,骚凹瑞,没看中间部分。
把 token 什么的放到 header 头里面,可以不用放 url,只要 url 没变是不会触发 options 的
jinliming2
2019-12-27 23:03:17 +08:00
1,网关层拦截所有 OPTIONS 请求,直接返回跨域授权信息,不要让 OPTIONS 请求进到业务代码里。
2,遵从同源策略部署代码,当然这得看实际情况。
3,将请求变为简单请求,不要使用特殊的 header 头,参数完全可以放在 query 参数或是 path 中。
qq450255457
2019-12-30 14:07:01 +08:00
@yeept 经过 google 查找后,通过 NGINX 把前后端置于一个域下,确实解决了 OPTIONS 请求的问题,谢谢。
qq450255457
2019-12-30 14:08:19 +08:00
@IMCA1024 该 API 接口耗时 75ms,加了个 OPTIONS 请求差不多 150ms.所以您说的接口是指什么呢?
qq450255457
2019-12-30 14:08:46 +08:00
@ai277014717 收敛 url host?
qq450255457
2019-12-30 14:09:45 +08:00
由于后端每个接口都需要参数 source,方便跟踪请求来源,那么你会把 source 放 body 中吗?
qq450255457
2019-12-30 14:11:30 +08:00
@jinliming2 您这是三种解决办法吗?
jinliming2
2019-12-30 15:58:24 +08:00
@qq450255457 是的,你 8 楼的解决方案就是我说的第二种,遵从同源策略,放到同一个域名下。
你 9 楼的问题,加了 OPTIONS 请求时间翻倍,说明 OPTIONS 请求进入了业务逻辑,也就是没有区分 OPTIONS 请求和 GET 请求,导致业务处理了两遍。就是我说的第一种方案,网关层直接拦截 OPTIONS 请求返回跨域许可,这样服务端耗时就几乎为 0 了,只剩下一次请求来回的耗时。(当然,也有可能是其他原因)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632926

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX