【问题标题】:Why doesn't d3.json send cookies with the request?为什么 d3.json 不随请求发送 cookie?
【发布时间】:2018-11-16 10:36:00
【问题描述】:

我不熟悉使用 d3.js (v5) 中的内置方法执行 ajax 请求。这是我的代码:

d3.json(uri).then(data =>console.log(data));

我在一个使用 cookie 身份验证的应用程序中尝试了这个,并不断收到 401 状态代码。使用 chrome 开发工具发现它发送的请求根本没有任何 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 开发工具显示它确实将身份验证 cookie 与请求一起发送,并且确实 request.status200 的形式返回,表明它确实已通过身份验证。

我的问题是:

  1. 如何配置d3.json 发送所需的cookie?
  2. 如何按状态捕获响应?例如,我想为 401 响应和 403 响应做一些不同的事情。
  3. 在哪里可以阅读有关如何使用 d3.json 的更完整文档或示例?我一直在做原生 ajax,因为我不使用 jquery,但如果它是我正在使用的库的一部分,我想学习如何使用它。但是documentation 对此几乎一言不发,page it links to 也无济于事。而且大多数教程都是针对以前版本的 d3 的,不再适用。

【问题讨论】:

    标签: javascript json ajax d3.js cookies


    【解决方案1】:

    版本 5 切换到使用 Fetch API,默认情况下不发送任何 cookie。您可以通过添加 d3.json 的选项来通过 fetch 来克服这个问题:

    d3.json(uri, {credentials: "same-origin"}).then(...);
    

    或者,对于跨域请求:

    d3.json(uri, {credentials: "include"}).then(...);
    

    如果返回 4XX 状态(或 5XX),D3 将导致 promise 被拒绝,您可以通过向 then 提供第二个回调函数来处理此问题。我欢迎更正,但我相信在这个函数中没有办法获得实际的状态码。

    我在文档中(撰写本文时)发现的对 Fetch 和 Promise 的更改的唯一提及是在更改日志中:D3 v5 Changes

    【讨论】:

    猜你喜欢
    • 2012-02-10
    • 2019-05-19
    • 1970-01-01
    • 2015-08-29
    • 2011-07-30
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多