如何使用JavaScript从REST API获取数据。我有几个基本的API,我想从中获取数据,不需要任何身份验证。所有的API都以JSON的形式返回我想要的数据。例如https://www.codewars.com/api/v1/users/MrAutoIt。我认为使用xmlhttprequest这将是一个非常简单的过程,但看起来same-origin policy给我带来了问题。
我尝试过几个教程,但它们似乎不适用于跨域或我不理解它们。我试图发布教程的链接,但我还没有足够的声誉。
答案 0 :(得分:3)
如果您尝试访问不在同一主机上的Web服务:端口作为发出请求的网页,您将遇到相同的源策略。您可以做几件事,但所有这些都需要服务的所有者为您做事。
1)由于相同的源策略不会影响脚本,因此允许服务通过JSONP而不是JSON进行响应;或
2)在授予您网页访问权限的网络服务响应中发送Access-Control-Allow-Origin
标题
如果您无法让服务所有者授予您访问权限,您可以在您控制下 的服务器上向服务器端(例如来自Node.js或PHP或Rails代码)发出请求,然后将数据转发到您的网页。但是,根据Web服务的服务条款,您可能违反了规定,并且您冒着被禁止服务器的风险。
答案 1 :(得分:2)
实际上,它取决于您的服务器REST API支持的JSONP或CORS。您还需要了解CORS的工作原理,因为有两种不同的情况:
GET
,HEAD
和POST
,我们就是这种情况。对于POST
方法,仅支持具有以下值的内容类型:text/plain
,application/x-www-form-urlencoded
,multipart/form-data
。OPTIONS
)来检查在跨域请求的上下文中可以执行的操作。也就是说,您需要在AJAX请求中添加一些内容以在服务器端启用CORS支持。我认为标题为Origin
,Access-Control-Request-Headers
和Access-Control-Request-Method
。
大多数像JSular这样的JS库/框架支持这样的方法。
使用jQuery(参见http://api.jquery.com/jquery.ajax/)。通过crossDomain
和xhrFields
>可以在此级别进行一些配置。 withCredentials
。
使用 Angular (请参阅How to enable CORS in AngularJs):
angular
.module('mapManagerApp', [ (...) ]
.config(['$httpProvider', function($httpProvider) {
delete $httpProvider.defaults.headers.common['X-Requested-With'];
});
如果您想为AJAX使用低级JS API,您需要考虑以下几点:
XMLHttpRequest
IE8 +中的Chrome和XDomainRequest
对象xhr.withCredentials
到true
。以下是一些可以帮助您的链接:
跳它帮助你, 亨利
答案 2 :(得分:-1)
以下是获取数据的方法。
var request = new XMLHttpRequest();
request.open('GET', 'https://www.codewars.com/api/v1/users/MrAutoIt', true);
request.onload = function() {
if (this.status >= 200 && this.status < 400) {
var resp = this.response; // Success! this is your data.
} else {
// We reached our target server, but it returned an error
}
};
request.onerror = function() {
// There was a connection error of some sort
};
request.send();
至于运行相同的原始政策...您应该从您控制的来源请求,或者您可以尝试停用Chrome的网络安全性,或者安装Allow-Control-Allow-Origin *等扩展程序来强制标题。
答案 3 :(得分:-1)
对于get方法,你可以这样:
@section scripts{
<script type="text/javascript">
$(function()
{
$.getJSON('/api/contact', function(contactsJsonPayload)
{
$(contactsJsonPayload).each(function(i, item)
{
$('#contacts').append('<li>' + item.Name + '</li>');
});
});
});
</script>
}
在此tutorial中检查主题:练习3:从HTML客户端使用Web API