向 API 发送 JSON 的服务器是 Gradle 包中的 Tomcat 服务器(它是用 Java 构建的)。
我在使用 Angular 进行 API 调用时遇到问题。我知道我的 API 正在运行,因为我可以在“Postman”上查看它。
var app = angular.module("todo", []);
app.controller("AppCtrl", function($http){
$http.get("192.168.5.100:8080/aggregators/datafile")
.success(function(data){
console.log(data)
})
})
当我运行它时,出现以下错误:
XMLHttpRequest cannot load %3192.168.5.100:8080/aggregators/datafile. Cross origin requests are only supported for HTTP.
最佳答案
您遇到的问题是,如果没有 CORS 或使用 JSONP,您无法从浏览器发出跨源请求。
Postman 在浏览器上下文之外运行(如果您熟悉 cURL,就好像您发出了 cURL 请求一样)。
这是出于安全原因。
那么,如何实现 JSONP 呢?它确实取决于服务器,但一般来说,您的资源会查找具有预先确定的查询字符串参数的 GET
请求(为简单起见,通常为 callback
):
http://192.168.5.100:8080/aggregators/datafile?callback=mycallback
如何进行 JSONP 调用?
服务器将 JSON 包装在该回调中,使其看起来如下所示:
mycallback({json:object});
This Stack Overflow answer goes into more detail .
回调
是浏览器在执行请求时应调用的函数,这就是允许跨域请求的原因。
现在,进入 CORS。
CORS 是一个允许浏览器与服务器通信以确定是否应该接受跨域请求的系统。这有点复杂,但一般来说它涉及在 API 服务器上设置某些 header ;然后以特定方式执行 Ajax 请求(对于 JQuery,请使用 $.ajax
的 withCredentials
属性)。服务器检查请求的来源,如果它是有效的来源,它会让浏览器知道并且浏览器允许该请求(我太简单了)。
MDN has a thorough explanation of CORS that is worth reading .
关于java - 自建API跨域错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23961041/