发送JSON到API的服务器是Gradle包中的Tomcat服务器(它是用Java构建的)。
我在用Angular进行API调用时遇到麻烦。我知道我的API正在工作,因为我可以在“邮递员”上查看它。
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,就无法从浏览器发出跨源请求。
邮递员在浏览器的上下文之外进行操作(如果您熟悉cURL,就好像您发出了cURL请求一样)。
这是出于安全原因。
那么,如何实现JSONP?它实际上取决于服务器,但是通常,您的资源将查找具有预定querystring参数(为简单起见通常为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。
callback
是执行请求时浏览器应点击的功能,这就是跨域请求的原因。现在,进入CORS。
CORS是一个系统,用于允许浏览器与服务器进行通信以确定它是否应该接受跨域请求。这有点复杂,但是总的来说,它涉及在API服务器上设置某些标头。然后以特定方式执行Ajax请求(对于JQuery,对于
withCredentials
使用$.ajax
属性)。服务器检查请求的来源,如果它是有效来源,则让浏览器知道并且浏览器允许该请求(我很简单)。MDN has a thorough explanation of CORS that is worth reading。