专栏文章 测试日记:接口为何多调用了一次?

Jerry li · 2019年02月01日 · 最后由 Jerry li 回复于 2019年02月02日 · 4214 次阅读

发现问题

在测试某个页面时,发现调试器里发现一个奇怪的现象:

如上图示,在正常的一个 post 请求之前, 额外多了一个 options 类型的请求。并且这个请求没有带参数,也没有返回值,只有 200 的响应。

问题分析

第一次遇到 options 类型的请求,于是搜索了一下相关的信息:

原文地址:https://www.jianshu.com/p/5cf82f092201

划一下重点:

  • 当发起跨域请求时,如果是非简单请求,浏览器会自动预检 (即发现的 options 请求,重点是浏览器自动做的)
  • 简单请求不会预检,非简单请求需要预检
  • 简单请求的三个条件

大概理清楚了问题发生的条件: 1. 这个请求是跨域的; 2. options 是浏览器的自主行为; 3. 这个请求可能不符合简单请求的条件。

问题确认

  • 1. 确认是否浏览器自主行为: 分别在 chrome 和 Firefox 上测试,都会自动预检
  • 2. 请求是否是跨域: 确认。
  • 3. 请求是否符合简单请求: 对比后发现接口的 Content-type 是 application/json ,所以不符合简单请求的条件。

沟通修复

  • 与开发说明该情况后,将 接口的 Content-type 修改为 text/plain, 测试验证不会再发送 options 的请求。
  • 分析整理其他相关的接口,确认有其他同类型的接口存在相同问题,统一安排修改和验证测试。

问题总结

  • options 的请求是第一次遇到,开发人员也不清楚具体的原因; 由于是浏览器的自主行为,倾向于不需要修改。 此时需要测试人员主动查找相关资料深入了解,说服、推动开发人员修复。
  • 以后在做跨域接口请求时需要在设计、测试阶段关注类似问题。
  • 通过解决这个问题,可以减少 50% 的请求数量(因为每个接口调用前都要先进行预检),一定程度上减轻了后台的压力,减少无畏的开销。
  • 测试时除了验证功能外,还需要花时间对实现的细节进行跟进。如接口调用是否正确、参数是否正确等。

我在【TesterHome 系列征文活动 | 有意思的 bug】https://testerhome.com/topics/33905 等你,一起 day day up!

共收到 2 条回复 时间 点赞

OPTION 请求只有在第一次访问的时候会请求一次,后面就不会请求了。浏览器有缓存的。这个带来的性能消耗微乎其微。

如果请求跨域了,必须要有 OPTION,否则前端收不到数据,即使把数据类型改为 text/plain 也没有用。

arrow 回复
  1. OPTION 请求只有在第一次访问的时候会请求一次,后面就不会请求了。

    从测试结果看,是每次都会请求 options 的,可能是我的方式不对?

  2. 如果请求跨域了,必须要有 OPTION
    测试结果如下:
    修改前:
    https://testerhome.com/uploads/photo/2019/1bf20558-9ef5-4a34-a887-a1dcb7ea87a8.png! large

修改后:

测试的结果说明,改成 text/plain 之后是不会触发 options 接口的。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册