我通过POST api调用生成二进制文件,使用nodejs作为java后端之上的抽象层。 我的期望是,每次生成一个新的二进制文件时,我都会得到一个InputMessage作为响应,我可以将其转换为可写流。这样我就可以将生成的文件下载/获取到我的本地文件系统。我使用POST的原因是请求参数的大小/数量有时可能很大。在过去,params有时不适合请求标头,所以我没有别的选择,只能从GET切换到POST并将文件生成参数放在POST请求体中。所以只是为了澄清这个前提,回到GET不是一个选择。
function downloadFile() {
const tempFile = tmp.fileSync();
const inStream = new Readable({
read() {
}
});
const outStream = fs.createWriteStream(tempFile.name);
return generateFile(params)
.then(response => {
inStream.push(response);
inStream.pipe(outStream);
outStream.on('finish', () => {
outStream.close(() => {
resolve();
});
});
outStream.on('error', err => {
reject(err);
});
});
}
主要的问题是,我最终得到的是将整个二进制文件作为响应中的字符串发送回来,而不是获取可读流。这就是为什么我决定将响应转换为可读流并首先将其传输到可写流中的原因。这或多或少有效,但由于某些编码问题,在上述过程中某些字符未正确解析,因此生成的文件已损坏/无用。 当我使用GET方法时,一切正常,正如预期的那样,我最终在响应中使用了一个InputMessage。
function downloadFile(url, dest) {
const file = fs.createWriteStream(dest);
return new Promise((resolve, reject) => {
http.get(url, response => {
response.pipe(file);
file.on('finish', () => {
file.close(() => {
resolve();
});
});
}).on('error', err => {
reject(err);
});
});
}
是否有办法以与定义的XMLHttpRequest.responseType类似的方式指定响应类型,就像是通过浏览器发送http POST请求一样? (给我一些响应类型选项,如blob,ms-stream或arraybuffer?