我很擅长使用d3.js(v5)中的内置方法执行ajax请求。这是我的代码:
d3.json(uri).then(data =>console.log(data));
我在使用Cookie身份验证的应用中尝试了此操作,并保持获取401状态代码。使用chrome dev工具显示它根本没有任何cookie发送请求。
这很奇怪,因为原生javascript中的ajax请求默认发送cookie以及每个请求。以下是本机javascript中ajax请求的示例:
function nativeAjax(uri, callback) {
let request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState === 4) {
callback(request);
}
}
request.open('get', uri, true);
request.send(null);
}
nativeAjax(uri, request => console.log(request.status));
将此插入我的应用程序,chrome dev工具显示它确实发送了身份验证cookie以及请求,而request.status
确实以200
显示它确实已经过身份验证。
我的问题是:
d3.json
发送所需的Cookie?答案 0 :(得分:2)
版本5切换为使用Fetch API,默认情况下不发送任何cookie。你可以通过添加d3.json的选项来解决这个问题,以便传递给fetch:
d3.json(uri, {credentials: "same-origin"}).then(...);
或者,对于跨源请求:
d3.json(uri, {credentials: "include"}).then(...);
如果返回4XX状态(或5XX),D3将导致拒绝承诺,您可以通过向then
提供第二个回调函数来处理。我欢迎更正,但我相信在这个函数中没有办法获得实际的状态代码。
我在文档中(在撰写本文时)发现的对Fetch和promises的更改的唯一提及是在更改日志中:D3 v5 Changes。