我正在尝试从浏览器中使用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,拒绝。
答案 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/T62835和https://www.mediawiki.org/wiki/Manual:CORS