結果をCSVファイルにストリーミングして、クエリ結果をエンドポイントからダウンロードする必要があります。これは、ブラウザーを介して一度に送信される膨大なResultSetをサポートするための作業です。
ReactアプリのコンテキストでAxiosを使用してこれを達成する方法はありますか?
私は fetch() を見て、次の特徴があることを知っています:
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
の例(ストリーミングではない)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;
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
ReadableStream
をfetch
と同じにすることはできますか?responseType: 'stream'
はブラウザで実行できるものではなく、Node.jsでfs
を使用した場合のみ可能ですfetch
または他の何かを使用することは可能ですか?ブラウザからの応答のストリーミングは現在サポートされていません:
https://github.com/axios/axios/issues/479
ブラウザーではXMLHttpRequests
を扱っているため、Axiosはwhatwg
によって設定された仕様に制限されます。 :
具体的には、サポートされているタイプは次のとおりです。
enum XMLHttpRequestResponseType {
"",
"arraybuffer",
"blob",
"document",
"json",
"text"
};
stream
はaxiosでresponseType
を設定するときに受け入れられますが、これは誤解を招く可能性があります。 XMLHttpRequestsに依存するブラウザを使用しているため、アダプタは暗黙的にxhr.js
になります。 HttpRequestsはサーバー側で作成され、axiosがhttp.js
アダプターを使用できるようにします。次に、Node.jsでResponseTypeとしてstream
を使用できます。
fetch
APIを使用することは、ReadableStream
をレスポンスボディタイプとして使用する唯一のソリューションのようです。