我正在尝试使用AJAX向nodeJS服务器发送CORS请求。我想返回一些JSON数据。我在网上找到了很多教程都说同样的东西,我试过了,但是我无法让它发挥作用。这是AJAX请求:
$.ajax({
url: "http://some.other.url.com:8880",
type: "GET",
crossDomain: true,
contentType: 'application/json'
}).then(function(response) {
$scope.allData = jQuery.parseJSON( response );
console.log($scope.allData);
}).fail(function(response) {
});
这是服务器上的代码:
var path = url.parse(req.url).pathname,
match = router.match(path),
rescode;
console.log("---: " + req.method);
if (req.method === 'OPTIONS') {
var headers = {};
headers["Access-Control-Allow-Origin"] = "*";
headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS";
headers["Access-Control-Allow-Credentials"] = false;
headers["Access-Control-Max-Age"] = '86400'; // 24 hours
headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept";
res.writeHead(200, headers);
return res.end();
}
我也尝试过没有返回res.end()
,即没有返回OPTIONS预检请求,但这也不起作用。
- Edit-- 以下是控制台中的实际错误消息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://other.domain.com:8880/. This can be fixed by moving the resource to the same domain or enabling CORS.
服务器正在获取请求。 OPTIONS和GET请求都会命中服务器并进行响应。实际上,在发出AJAX请求的页面的控制台日志中,我可以单击CORS错误并查看响应,这是正确的数据。但我似乎无法让javascript继续下去。
关于.done
vs .then
,它们似乎可以互换。或者至少,在此示例中,.then
和.fail
工作得很好。
答案 0 :(得分:2)
您在OPTIONS预检响应中正确设置了CORS标头,但您还需要在实际GET响应中设置Access-Control-Allow-Origin
(对原点或*
)。无论是否有预检响应,GET响应都应使用相同的CORS标头进行响应。这意味着它必须发送适当的CORS头,但除了Access-Control-Allow-Origin
之外,它不需要发送任何内容。 (如果涉及其他非简单组件,如非简单动词或标题,它们将在预检中被允许或拒绝;实际的GET响应不需要担心它们。)
Enable CORS网站有一个CORS testing tool,可帮助您查看您指定的请求中涉及的标头。我已经使用该工具设置了test similar to your case(带有非简单Content-Type
标头的GET)。如果我们检查一下这个测试的结果(小心 - 步骤有点乱,但它们都在那里),我们看到了一个预检响应:
Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS
...
Access-Control-Allow-Origin: http://client.cors-api.appspot.com
Access-Control-Allow-Headers: X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept
最后的CORS回复:
Content-Length: 0
Content-Type: application/json
Access-Control-Allow-Origin: http://client.cors-api.appspot.com
Cache-Control: no-cache
如您所见,GET响应还有一个Access-Control-Allow-Origin
标头,没有其他CORS标头。如果您有任何进一步的不确定性,请随意调整该工具的设置以运行各种其他测试用例。