获取API默认的跨源行为

时间:2017-05-22 20:39:58

标签: cors fetch fetch-api

Fetch Specifications表示默认的抓取模式是“无人”' -

  

请求具有关联模式,即"同源"," cors"," no-cors","导航&#34 ;或者" websocket"。除非另有说明,否则它是" no-cors"。

但是,我似乎注意到mode: 'no-cors'和未指定模式之间的这种行为差异。如此JSFiddle sample所示,明确将模式定义为“无人”。使响应无法访问Javascript,而不指定模式使响应对象可用于调用方法。

显式指定获取模式的工作方式与内部使用相同模式的默认行为有何不同?我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

对于跨源请求,Fetch算法会将请求的“response tainting”设置为cors,并要求使用CORS protocol执行提取。

具体来说,请参阅“Main fetch” algorithm的第12步的以下子步骤:

  

请求当前网址的来源与请求的来源相同   原点和 CORS标志未设置
  ↪请求的当前网址方案为“data
  ↪请求的模式为“navigate”或“websocket
  1.将请求的响应设置为“basic”   2.使用 request 返回执行方案获取的结果   ...
  ↪ 请求的模式为“no-cors
  1.将请求的响应设置为“opaque”   2.使用 request 返回执行方案获取的结果   ...
  ↪否则
  1.将请求的响应设置为“cors”   2.使用 CORS标志设置的请求返回执行HTTP提取的结果。

如果请求网址与您的代码的来源不同,且该方案不是data且模式不是navigate或{{1或者未明确设置为websocket,然后达到其他条件,并使用CORS protocol发出请求。

这个解释简化了一些事情,因为在请求具有触发浏览器进行预检的特性的情况下,有一个子步骤正好在否则子步骤之上,而是再次到达在这种情况下,“响应污点”设置为no-cors

  

但是,我似乎注意到cors和未指定模式之间的这种行为差异。

不同之处在于,当您为请求明确设置mode: 'no-cors'时,在这种情况下,“↪请求的模式是”no-cors“”子步骤到达而不是否则子步骤。

(虽然我认为可能会对规范进行细化,以便更清楚地说明此时的模式实际上并不是默认为mode: 'no-cors' - 这可能是基于的结论“除非另有说明,否则问题中引用的规范是”no-cors“”声明。)

  

正如在这个JSFiddle示例中所示,明确将模式定义为'no-cors'会使Javascript无法访问响应,

正确 - 这是因为它导致“↪请求的模式在”主要获取“算法中是”无法“”子步骤而不是否则子步骤。

  

虽然未指定模式,但Response对象可用于调用方法。

因为否则子步骤确实到达了,所以启用了一个启用CORS的提取。

  

显式指定获取模式的工作方式与内部使用相同模式的默认行为有何不同?

是的,对于跨源请求,明确设置no-cors会强制执行请求而不使用CORS,而保留未指定的请求会导致使用CORS。

但如上所述,我认为可能会对此规范进行细化以使其更清晰。

我认为“除非另有说明,否则”mode: 'no-cors'“”关于该模式的声明绝对不是要指定使用{{1}进行的请求没有指定显式模式的方法最终将其模式锁定为no-cors