No' Access-Control-Allow-Origin'标题存在。因此不允许原点访问

时间:2015-09-30 06:50:48

标签: javascript http cors mediawiki mediawiki-api

编辑:没有JSONP!是的我知道CORS由服务器处理,是的,服务器确实支持它。问题就在我身边。

我正在尝试从浏览器中使用MediaWiki API。我通过XMLHttpRequest发送GET请求,但由于CORS问题,它只是无法正常工作。收到回复后,我从浏览器收到以下消息:

  

XMLHttpRequest无法加载https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=Oculus&utf8。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://127.0.0.1:8000'因此不允许访问。

我理解为什么我会遇到这个问题,但我不知道如何从浏览器/ JavaScript端解决这个问题。

代码:

xmlhttp.open("GET","https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=" + subreddit + "&utf8",true);
xmlhttp.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
xmlhttp.send();

我尝试过的一些事情:

xmlhttp.setRequestHeader('Access-Control-Allow-Origin', 'http://localhost');
xmlhttp.setRequestHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
xmlhttp.setRequestHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
xmlhttp.setRequestHeader('Access-Control-Allow-Credentials', true)
xmlhttp.setRequestHeader("Content-Type", "application/json; charset=UTF-8");

并在url中设置参数origin,或者将setDequestHeader设置为返回无效/坏的Origin,拒绝。

3 个答案:

答案 0 :(得分:2)

您可以使用JSONP。

<script src='https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=Oculus&utf8&callback=callbackname'></script>
<script>
    function callbackname(data){
       //you can get response data here
    }
</script>

如果你使用jquery。

$.getJSON('https://en.wikipedia.org/w/api.php?format=json&action=query&list=search&srsearch=Oculus&utf8&callback=?', function(data){
    //you can get response data here
})

答案 1 :(得分:1)

如上所述here,您在请求中传递的origin参数以及浏览器在AJAX调用中发送的Origin标头应该匹配,并且它必须匹配匹配外部wiki上$wgCrossSiteAJAXdomains中的一个值。由于您的Origin(http://127.0.0.1:8000或localhost:8000在您的情况下)将无法在$wgCrossSiteAJAXdomains中使用,MediaWiki API将永远不会在响应中发送Access-Control-Allow-Origin标头,并且任何CORS请求都将失败您在浏览器控制台中看到的错误。

要考虑的另一个重要事实是

  

MediaWiki API在维基媒体网站上用于执行诸如允许图像之类的操作   从移动设备上的维基百科网站直接上传到Commons   接口

此API不适用于任何主机的公共消费,仅适用于一组经过验证的主机。

如果您想尝试一些CORS请求,可以使用here中的GitHub API。 这是一个示例pen向GitHub API发出CORS请求,并将JSON响应记录到DevTools控制台。

答案 2 :(得分:1)

目前无法执行您想要的操作,因为存在允许使用CORS的服务器端原始白名单,并且您的服务器不在白名单中。

目前MediaWiki中没有auth-less CORS选项,因此白名单适用于所有CORS请求,无论它们是否包含auth。

请参阅https://phabricator.wikimedia.org/T62835https://www.mediawiki.org/wiki/Manual:CORS