了解页面响应

时间:2017-08-16 15:00:34

标签: javascript api xmlhttprequest cors httprequest

我试图了解整个CORS政策是如何运作的。为了解释我的困惑,让我举个例子:

$.get("https://www.google.com", function(response) { alert(response) });

上述请求将返回,并显示以下错误:

  

XMLHttpRequest无法加载https://www.google.com/。从' https://www.google.com/'重定向到' https://www.google.ca/?gfe_rd=cr&ei=TlqUWeGEH5HRXqW6utgI'被CORS政策阻止:No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' https://fiddle.jshell.net'因此不允许访问。

现在为了让它发挥作用,谷歌必须列入https://fiddle.jshell.net白名单。

现在,如果我在一个宁静的API页面上尝试同样的事情,那就行了。我的问题很简单,为什么?

尝试分析这一点,我尝试点击API并分析其响应:

https://apigee.com/console/bing?req=%7B%22resource%22%3A%22web_search%22%2C%22params%22%3A%7B%22query%22%3A%7B%22query%22%3A%22sushi%22%2C%22sources%22%3A%22web%22%7D%2C%22template%22%3A%7B%22format%22%3A%22json%22%7D%2C%22headers%22%3A%7B%7D%2C%22body%22%3A%7B%22attachmentFormat%22%3A%22mime%22%2C%22attachmentContentDisposition%22%3A%22form-data%22%7D%7D%2C%22verb%22%3A%22get%22%7D

响应:

HTTP/1.1 200
Date:
Wed, 16 Aug 2017 14:31:32 GMT
Content-Length: 266
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Server: Apigee Router
X-Content-Type-Options: nosniff

我得出的结论是它必须是标题。具体来说,我相信它是这个标题:Content-Type: application/json;但我不确定,我正在努力理解这一点,并希望有人可以向我解释。

1 个答案:

答案 0 :(得分:1)

所以我做了2次测试:从控制台运行代码function e3_add_query_vars($vars) { $vars[] = 'as'; $vars[] = 'bs'; return $vars; } add_filter( 'query_vars', 'e3_add_query_vars' ); 代码段并从https://apigee.com/console/others

请求$.get("https://www.google.com", function(response) { alert(response) });

我认为在第一种情况下发生的事情是请求是从客户端完成的,下一个请求头被发送:

https://www.google.com

由于Google不回复:authority:www.google.com :method:GET :path:/?_=1502896196820 :scheme:https accept:*/* accept-encoding:gzip, deflate, br accept-language:en-US,en;q=0.8 origin:https://stackoverflow.com referer:https://stackoverflow.com/questions/45717044/understanding-page-response user-agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3187.0 Safari/537.36 x-chrome-uma-enabled:1 x-client-data:CJG2yQEIo7bJAQiMmMoBCKudygEIs53KAQjRncoBCKiiygE= - 客户端,并且在请求中我'Access-Control-Allow-Origin: *',因此我的Chrome会抛出CORS错误。

在第二次测试中,使用https://apigee.com/console/others并请求origin:https://stackoverflow.com,apigee.com似乎会覆盖标题并发送:

https://www.google.com

另外,从DEV控制台,我可以看到它服务器到服务器的调用,所以没有客户参与抛出CORS,因此我收到了Google页面的回复。

<强>更新

关于JSON API请求,以下是Google CloudPlatform关于CORS的一些有趣信息

  

注意:CORS配置仅适用于XML API请求。对于JSON   API请求,云存储返回Access-Control-Allow-Origin   带有请求来源的标题。

因此,如果请求是从客户端执行的,则客户端不应抛出CORS错误,因为它获取的Access-Control-Allow-Origin与它发送的源相同。

但是,不同的API和客户端可能会以不同方式处理请求。因此,有时Firefox会抛出CORS,而Chrome则不会。