node.js - 如何从 AWS MWS API json 响应下载 .xlsx 文件?
问题描述
我正在使用Express JS server
来执行AWS MWS API
. 根据MWS
文档,_GET_REMOTE_FULFILLMENT_ELIGIBILITY_
返回 excel 文件对象。
我在其中创建了 API,node js
但无法获得正确的 excel。我在下载的 excel 文件中有奇怪的字符。
const getRemoveFulfillmentEligibilityDataCon = async(req,res) => {
const mwsRequestData = {
Version: '2009-01-01',
Action: 'GetReport',
'SellerId': 'MWS_SELLER_ID',
'MWSAuthToken': 'MWS_AUTH_TOKEN',
ReportId: 'XXXXXXXXXXXXXX',
};
try {
const response = await amazonMws.reports.search(mwsRequestData);
/* make the worksheet */
var ws = XLSX.utils.json_to_sheet(response.data);
var wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws);
XLSX.writeFile(wb, "sheetjs.xlsx");
return response;
} catch (error) {
console.log('error ', error);
return error;
}
}
解决方案
最后,我得到了解决方案。我改变了调用 API 的方法,如下所示,我得到了一个正确的 excel 文件。
我使用 node-fetch,然后通过 node-fetch 向亚马逊 MWS 发送请求。
node-fetch 正确解码内容编码 (gzip/deflate) 并将字符串输出自动转换为 UTF-8。
var param = {};
param['AWSAccessKeyId'] = 'xxxxxxxxxxxxx';
param['Action'] = 'GetReport';
param['MarketplaceId'] = 'xxxxxxxxxxxxx';
param['SellerId'] = 'xxxxxxxxxxxxx';
param['ReportId'] = 'xxxxxxxxxxxxx';
param['ItemCondition'] = 'New';
param['SignatureMethod'] = 'HmacSHA256';
param['SignatureVersion'] = '2';
param['Timestamp'] = encodeURIComponent(new Date().toISOString());
param['Version'] = '2009-01-01';
secret = 'xxxxxxxxxxxxx';
var url = [];
for(var i in param){
url.push(i+"="+param[i])
}
url.sort();
var arr = url.join("&");
var sign = 'POST\n'+'mws.amazonservices.com\n'+'/Reports/2009-01-01\n'+arr;
const crypto = require('crypto');
let s64 = crypto.createHmac("sha256", secret).update(sign).digest('base64');
let signature = encodeURIComponent(s64);
var bodyData = arr+"&Signature="+signature;
const fileName = "sheetjs.xlsx";
var apiResponse = await fetch('https://mws.amazonservices.com/Reports/2009-01-01', {
method: 'POST',
body: bodyData,
headers: {
'content-type': 'application/x-www-form-urlencoded',
'Accept': '',
},
})
.then(res => {
const dest = fs.createWriteStream('./'+fileName);
res.body.pipe(dest).on('finish', function(){
//console.log('done');
return {'Status': 200, 'Message': 'Downloaded'};
});
})
.catch(error => {
console.log('Request failed', error);
});
return apiResponse;
}
推荐阅读
- reactjs - 模式:在 React 中实现配置菜单的正确方法
- python - 在库“/usr/lib/R/lib/libR.so”中找不到 rpy2 错误符号“R_tryCatchError”
- java - 加载图像时出错 - java.lang.IllegalArgumentException: input == null
- python - 使用 Python 将计划转换为综合报告
- vb.net - 如何在VS 2012中使拖放对象实时移动,带有边框等
- wordpress - Woocommerce 购物车 - 按类别排序
- google-oauth - 更改已验证应用的应用名称 - Google OAuth 同意屏幕
- javascript - 如何根据所选日期获取图表上的数据(使用日期选择器过滤数据图表 JS)
- javascript - 如何通过部分或 div 创建缩放滚动效果到下一个?
- visual-studio - 如何获取 Visual Studio Community 2019 的 x64 本机工具开发人员命令提示符?