访问纽约时报 API 和维基媒体 API 之间的区别?
The difference between accessing the NY Times API and a Wikimedia API?
我目前正在学习 Udacity Front-End Web Developer Nanodegree 课程,并且我正在学习 AJAX 课程。
我的项目是获取地址并:
- 加载纽约时报文章
- 从 Google 街景
加载背景图片
- 从维基百科加载相关文章
我已经完成了前两个。第三个要求 jsonp
或 CORS
,我的问题是:为什么?
前两个工作正常的调用之间有什么区别:
http://api.nytimes.com/svc/search/v2/articlesearch.json?q=somecity&api-key=...
http://maps.googleapis.com/maps/api/streetview?size=600x400&location=...
这个失败了?
https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=...
注意:以上网址为:
- 使用
jQuery.getJSON()
(纽约时报)搜索文章
- 用作背景图片的
src
(Google 街景)
- 使用
jQuery.ajax()
(维基百科)搜索了相关文章
来自维基百科尝试的错误消息是:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://...' is therefore not allowed access.
重申一下:维基百科试图阻止什么情况?
更新:
实际使用的网址是:
http://api.nytimes.com/svc/search/v2/articlesearch.json?q=somecity%20somestate&api-key=...
http://maps.googleapis.com/maps/api/streetview?size=600x400&location=999%20main%20st,%20somecity%20somestate
https://en.wikipedcwodecgia.org/w/api.php?action=query&format=json&list=search&srsearch=somecity%20somestate&callback=jQuery111107555398044642061_1459988112375&_=1459988112376
我不是 100% 了解维基媒体在这里试图阻止的事情......
Same-origin 策略是您问题的根源,这是 Web 应用程序安全模型中的一条指令,要求一页(HTML 文档等)中的 script
s与另一页同源,以便访问该另一页的数据。
它是防止所有脚本小子在网站上造成破坏和混乱的文字墙。像所有的长城一样,same-origin 政策是双向的:如果你要 data/access/services 成为 consumed/used,你的选择将非常有限。
一个选项是 Google 地图/API 选项,您可以在其中 sign-up 获取密钥,通过身份验证绕过 same-origin 策略。
另一个选项是 JSONP,其中 "P" 是围绕 JSON 数据的函数。该函数的有效负载 JSON 可供来自不同来源的 script
访问,因为它作为 object 提供服务并进入 JS 全局命名空间。调用该函数会导致浏览器将 return 有效负载评估为 JavaScript 并允许它跨源。
第三个选项是 CORS - Cross-origin 资源共享。它通过根据预选源列表检查发出请求的源来克服 same-origin 策略。如果来源在列表中,它会在服务器的 header 响应中 returned,授予访问权限。
同样,我不完全确定为什么维基媒体使用 JSONP 和 CORS 来克服 same-origin 政策,但允许成员站点之间的访问一定是其背后的主要推动力。
我目前正在学习 Udacity Front-End Web Developer Nanodegree 课程,并且我正在学习 AJAX 课程。
我的项目是获取地址并:
- 加载纽约时报文章
- 从 Google 街景 加载背景图片
- 从维基百科加载相关文章
我已经完成了前两个。第三个要求 jsonp
或 CORS
,我的问题是:为什么?
前两个工作正常的调用之间有什么区别:
http://api.nytimes.com/svc/search/v2/articlesearch.json?q=somecity&api-key=...
http://maps.googleapis.com/maps/api/streetview?size=600x400&location=...
这个失败了?
https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=...
注意:以上网址为:
- 使用
jQuery.getJSON()
(纽约时报)搜索文章 - 用作背景图片的
src
(Google 街景) - 使用
jQuery.ajax()
(维基百科)搜索了相关文章
来自维基百科尝试的错误消息是:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://...' is therefore not allowed access.
重申一下:维基百科试图阻止什么情况?
更新:
实际使用的网址是:
http://api.nytimes.com/svc/search/v2/articlesearch.json?q=somecity%20somestate&api-key=...
http://maps.googleapis.com/maps/api/streetview?size=600x400&location=999%20main%20st,%20somecity%20somestate
https://en.wikipedcwodecgia.org/w/api.php?action=query&format=json&list=search&srsearch=somecity%20somestate&callback=jQuery111107555398044642061_1459988112375&_=1459988112376
我不是 100% 了解维基媒体在这里试图阻止的事情......
Same-origin 策略是您问题的根源,这是 Web 应用程序安全模型中的一条指令,要求一页(HTML 文档等)中的 script
s与另一页同源,以便访问该另一页的数据。
它是防止所有脚本小子在网站上造成破坏和混乱的文字墙。像所有的长城一样,same-origin 政策是双向的:如果你要 data/access/services 成为 consumed/used,你的选择将非常有限。
一个选项是 Google 地图/API 选项,您可以在其中 sign-up 获取密钥,通过身份验证绕过 same-origin 策略。
另一个选项是 JSONP,其中 "P" 是围绕 JSON 数据的函数。该函数的有效负载 JSON 可供来自不同来源的 script
访问,因为它作为 object 提供服务并进入 JS 全局命名空间。调用该函数会导致浏览器将 return 有效负载评估为 JavaScript 并允许它跨源。
第三个选项是 CORS - Cross-origin 资源共享。它通过根据预选源列表检查发出请求的源来克服 same-origin 策略。如果来源在列表中,它会在服务器的 header 响应中 returned,授予访问权限。
同样,我不完全确定为什么维基媒体使用 JSONP 和 CORS 来克服 same-origin 政策,但允许成员站点之间的访问一定是其背后的主要推动力。