一盏小灯 测试日记:接口为何多调用了一次?

Jerry li · February 01, 2019 · Last by Jerry li replied at February 02, 2019 · 1727 hits

发现问题

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

如上图示,在正常的一个 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% 的请求数量(因为每个接口调用前都要先进行预检),一定程度上减轻了后台的压力,减少无畏的开销。
  • 测试时除了验证功能外,还需要花时间对实现的细节进行跟进。如接口调用是否正确、参数是否正确等。
共收到 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 接口的。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up