【发布时间】:2017-08-18 09:00:31
【问题描述】:
当我对 api 进行 GET 调用时,我收到错误响应“500(内部服务器错误)”。这是错误消息:
XMLHttpRequest 无法加载 http://10.10.14.188:4800/api/v1/healthMonitor/DeviceStatus。回复 预检请求未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://192.168.4.217” 使用权。响应的 HTTP 状态代码为 500。
…虽然我在尝试使用邮递员或使用 curl 命令时得到了响应。
在这个调用中,我必须在标题中传递一个 id。代码如下:
this.getState = function () {
return $http({
method: 'GET',
url: 'http://10.10.14.188:4800/api/v1/healthMonitor/DeviceStatus',
headers: {'Jab_Device_id': '80f1374192a6d6eb9ebf48e2eba18366','Content-Type': 'application/json'}
});
};
另外,我尝试使用 Ajax,但也遇到了同样的错误。代码如下:
$.ajax({
url: 'http://10.10.14.188:4800/api/v1/healthMonitor/DeviceStatus',
headers: {
'Jab_Device_id':'80f1374192a6d6eb9ebf48e2eba18366'
},
method: 'GET',
withCredentials: true,
success: function(data){
console.log('succes: '+data);
}
});
【问题讨论】:
-
服务是否实现了CORS?,允许的调用来源是什么。
-
是的。它有。否则我不会通过邮递员或使用 curl 命令得到响应。
-
您从邮递员那里得到响应或使用 curl 命令的事实并不能告诉您在
http://10.10.14.188:4800/api/v1/healthMonitor/DeviceStatus服务器上配置了 CORS 支持。即使那里没有配置 CORS,您仍然可以使用 postman 或 curl 命令获得响应 -
因为您的请求添加了
Jab_Device_id标头,这会触发您的浏览器执行CORS preflight OPTIONS request。因此,要使用 curl 模拟此处发生的情况,您需要这样做:curl -X OPTIONS -i -H 'Origin: http://192.168.4.217/' -H 'Access-Control-Request-Method: GET' -H 'Access-Control-Request-Headers: Jab_Device_id' http://10.10.14.188:4800/api/v1/healthMonitor/DeviceStatus。如果你尝试使用 curl,我敢打赌你会得到与浏览器相同的 500 响应。 -
我使用了这个:- curl --verbose -X GET -H "Jab_Device_Id":"2df37485bd7d2835b16ba40649cd0c2f" -H "Accept: application/json" 10.10.14.188:4800/api/v1/healthMonitor/DeviceStatus 我得到了响应
标签: angularjs http http-status-code-500