gpt4 book ai didi

javascript - 在 React App 中使用 Axios 将响应数据下载为流

转载 作者:行者123 更新时间:2023-12-01 15:40:03 26 4
gpt4 key购买 nike

问题

我需要通过将结果流式传输到 CSV 文件来从端点下载查询结果。这是为了支持一次通过浏览器发送大量的结果集。

有没有办法在 React App 的上下文中使用 Axios 来实现这一点?

我看过fetch()并且知道它具有以下特点:

  • 返回 ReadableStream
  • IE11 不支持
  • 不允许拦截请求
  • 状态 响应与请求本身有关,与 HTTP 状态无关
  • 这意味着接收错误的唯一方法是让流提前结束
  • 出现问题。
  • 这绝对对我不起作用,因为我有与用户权限相关的自定义错误处理

  • 除了 ReadableStream响应类型,列出的其余特征是不允许的。我需要支持 IE11 并允许拦截请求/读取 HTTP 状态以确定如何处理流量。
    fetch 的示例:

          // The promise returned by `fetch` rejects if the fetch was unable to make HTTP-request
    // e.g. network problems, or there’s no such site.
    // Abnormal HTTP-statuses, such as 404 or 500 do not cause an error.
    const results = await fetch(`${URL}/data`, {
    method: 'post', // HTTP POST to send query to server
    headers: {
    Accept: 'application/json, text/plain, */*', // indicates which files we are able to understand
    'Content-Type': 'application/json', // indicates what the server actually sent
    },
    body: JSON.stringify(query), // server is expecting JSON
    credentials: 'include', // sends the JSESSIONID cookie with the address
    }).then(res => res.json()) // turn the ReadableStream response back into JSON
    .then((res) => {
    if (res.ok) {
    // boolean, true if the HTTP status code is 200-299.
    console.log('response.ok!');
    } else if (res.status === 401) {
    throw Error(`You are not authenticated. Please login.`);
    } else if (res.status === 403) {
    throw Error(`You are not authorized to access this data.`);
    } else {
    throw Error(`Request rejected with status ${res.status}`);
    }
    })
    .catch((error) => {
    // catches error case and if fetch itself rejects
    error.response = {
    status: 0,
    statusText:
    'Cannot connect. Please make sure you are connected to internet.',
    };
    throw error;
    });

    console.log(results);
    axios 的示例(不是流式传输)

    Axios 实例

    import ...
    const Api = axios.create({
    baseURL: `${URL}`,
    withCredentials: true,
    });

    // attach interceptors to requests and responses
    // these are defined elsewhere and imported
    Api.interceptors.request.use((request) => requestHandler(request));
    Api.interceptors.response.use((response) => successHandler(response), (error) => errorHandler(error));

    export default Api;

    axios 请求

    const query = {"selections":{"TABLE_A":["COLUMN1"]},"filters":[{"predicates":[]}],"joins":[],"sorts":[],"limit":100,"offset":0}
    const response = await Api.post('/data', query);
    // further transformations to response to get formatted csv results required

    关于 Axios 的问题
  • 是否有可能拥有 ReadableStream在 Axios 中与 fetch 相同?
  • 只有在假设 Node 在仅服务器端设置中支持它时,才能在 Axios 中进行流式传输?
  • this 这样的网站似乎说使用 responseType: 'stream'不是可以在浏览器中完成的,只有 Node.js 使用 fs
  • 是否可以使用fetch还是与 Axios 结合的其他东西?
  • 最佳答案

    来自浏览器的流式响应是 不是 目前支持:

    https://github.com/axios/axios/issues/479

    因为我们正在处理 XMLHttpRequests在浏览器中,Axios 仅限于 whatwg 设置的规范. :

  • https://xhr.spec.whatwg.org/#interface-xmlhttprequest
  • https://github.com/whatwg/xhr

  • 具体来说,这些是唯一受支持的类型:

    enum XMLHttpRequestResponseType {
    "",
    "arraybuffer",
    "blob",
    "document",
    "json",
    "text"
    };
    stream设置 responseType 时被接受在 axios 中,但这具有误导性。适配器将是 xhr.js隐含地,因为我们使用的是依赖于 XMLHttpRequests 的浏览器。 HttpRequests 是在服务器端发出的,允许 axios 使用 http.js适配器。那么你可以使用 stream作为 Node.js 的 ResponseType。

    使用 fetch API 似乎是唯一具有 ReadableStream 的解决方案作为响应体类型。

    关于javascript - 在 React App 中使用 Axios 将响应数据下载为流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60044205/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com