Node.js 如何从AWS MWS API json响应下载.xlsx文件?

Node.js 如何从AWS MWS API json响应下载.xlsx文件?,node.js,express,export-to-excel,amazon-mws,node-fetch,Node.js,Express,Export To Excel,Amazon Mws,Node Fetch,我正在使用expressjsserver执行AWS-MWS-API。根据MWS文档,获取\u远程\u履行\u资格返回excel文件对象 我在节点js中创建了API,但无法获得正确的excel。我下载的excel文件中有奇怪的字符 您可以在附件中看到下载的excel文件 最后,我找到了一个解决办法。我改变了我的方法来调用API,如下所示,我得到了一个合适的excel文件 我使用节点获取,然后通过节点获取将请求发送到AmazonMWS 节点获取正确解码内容编码(gzip/deflate),并将字符串

我正在使用
expressjsserver
执行
AWS-MWS-API
。根据
MWS
文档,
获取\u远程\u履行\u资格
返回excel文件对象

我在
节点js
中创建了API,但无法获得正确的excel。我下载的excel文件中有奇怪的字符

您可以在附件中看到下载的excel文件


最后,我找到了一个解决办法。我改变了我的方法来调用API,如下所示,我得到了一个合适的excel文件

我使用节点获取,然后通过节点获取将请求发送到AmazonMWS

节点获取正确解码内容编码(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;
}
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;
}