我试图使用JavaScript和CORS访问维基百科。
据我所知,维基百科应该支持CORS:请求
我尝试了以下脚本:创建一个XMLHttpRequest+凭证/XDomainRequest,添加一些HTTP头(“访问控制-允许-凭据”,等等)。然后发送查询。
http://jsfiddle.net/lindenb/Vr7RS/
var WikipediaCORS=
{
setMessage:function(msg)
{
var span=document.getElementById("id1");
span.appendChild(document.createTextNode(msg));
},
// Create the XHR object.
createCORSRequest:function(url)
{
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr)
{
xhr.open("GET", url, true);
}
else if (typeof XDomainRequest != "undefined")
{
xhr = new XDomainRequest();
xhr.open(method, url);
}
else
{
return null;
}
xhr.setRequestHeader("Access-Control-Allow-Credentials", "true");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
return xhr;
},
init:function()
{
var _this = this;
var url = 'http://en.wikipedia.org/w/api.php?action=opensearch&search=Javascript&format=json';
var xhr = this.createCORSRequest(url);
if (!xhr)
{
this.setMessage('CORS not supported');
return;
}
xhr.onload = function()
{
_this.setMessage(xhr.responseText);
};
xhr.onerror = function()
{
_this.setMessage('Woops, there was an error making the request.');
};
xhr.send();
}
};
但是我的脚本失败了(调用“xhr.onerror”)。我怎么才能修好它?
发布于 2014-05-30 02:22:16
CORS标头被发送以允许请求脚本访问内容。
维基百科是派来的不是你。
根据评论::
维基百科是一般规则的一个例外,它要求您将origin
参数附加到您请求的URL中。
我认为这背后的原因与缓存有关。我不知道他们使用的是哪种机制,但这可能会使他们更容易更好地存储缓存对象并以这种方式构建变体。
有关CORS的更多信息,请参阅MediaWiki API文档:
CORS API还要求将源作为请求参数提供,该参数名为“MediaWiki”,与CORS协议所需的源标头匹配。请注意,这个头必须包含在任何飞行前请求中,因此即使对于POST请求,也应该包括在请求URI的查询字符串部分中。 如果CORS原始检查通过,MediaWiki将在响应中包含访问控制允许凭据: true标头,因此可以发送身份验证cookie。
这意味着你必须发送一个Origin
头来告诉维基百科你来自哪里。维基百科是在管理访问,而不是你。
发送此源标头:
xhr.setRequestHeader("Origin", "http://www.yourpage.com");
Access-Control-Allow-*
头是响应头,而不是请求头。
此外,维基百科还需要内容类型json。
xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
发布于 2016-08-12 07:20:19
我在做一个freeCodeCamp项目时也遇到了同样的问题,解决方案太简单了,我笑了,因为我花了几个小时来寻找它。在您的jQuery URL中包括下面的参数。
&origin=*
$.getJSON(
'https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=15&generator=search' +
'&origin=*' + // <-- this is the magic ingredient!
'&gsrsearch='q, function(data){ /* ... */ }
);
发布于 2016-08-07 09:22:13
截至2016年8月,Wikipedia通过使用普通的Ajax请求(不需要JSONP/回调操作)支持CORS请求。这可以通过在API调用中设置原点来实现。
对于经过身份验证的请求,这必须与Origin中的“源”之一完全匹配(您需要在执行Ajax调用时使用beforeSend属性来设置这个值)。
对于未经身份验证的请求,您可以简单地将其设置为星号(*),并且它在使用来自域的简单$.getJSON时工作。
示例API调用:
https://en.wikipedia.org//w/api.php?action=opensearch&format=json&origin=*&search=stack&limit=10
更多是在MediaWiki API沙箱:MediaWiki API沙箱。
https://stackoverflow.com/questions/23952045
复制