GAS:连接到API时出现错误401

时间:2020-06-01 21:02:24

标签: google-apps-script urlfetch

我正在尝试连接到Cloud Waitress API(一种餐馆解决方案)

文档:https://apidocs.cloudwaitress.com/#orderpromos

该文档提供了有关如何连接到API的示例:

curl https://api.cloudwaitress.com/v1/orders \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: YOUR_API_KEY" \ 
  -d `
    {
      "restaurant_id": "xxxxxxx",
      "limit": 10,
      "page": 1,
      "sort": { "created": -1 },
    }
  `

我试图在GAS中创建一个脚本,以将信息返回到电子表格。

基于此问题:

How curl maps onto Google App Script URLFetchApp

我更改了我的代码,如下所示:

function getAuthHeader(){
  var apiKey = "SOME-API-KEY";
  var authHeader = Utilities.base64Encode(apiKey);
  return {
    headers: {Authorization: authHeader}
   }
}

function GetOrders(){  
  var url = "https://api.cloudwaitress.com/v1/orders";  

  var data = {
    "restaurant_id":"SOME-RESTAURANT-ID",
    "limit": 10,
    "page": 1,
    "sort": { "created": 1 }
  };

  var result = goPost(url ,data);

}

function goPost(url,data){
   var options = {
   'method' : 'post',
   'payload' : data,
   'headers': getAuthHeader()['headers']
   };

   var response; 

   try{
     response = JSON.parse(UrlFetchApp.fetch(url,options).getContentText());
   }catch(err){
    Logger.log(err);
   }

   return response;
 }

现在我遇到的新错误是:

例外:对https://api.cloudwaitress.com的请求失败 代码401。服务器响应被截断:{“结果”:1,“消息”:“无效 身份验证”}(使用MutantHttpExceptions选项检查完整 响应)

自从我之前遇到500错误以来,我相信这是一个很大的进步。

enter image description here

我已经向cloudwaitress团队寻求帮助,但是我想知道是否还有其他可以尝试的方法。

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

该修改如何?

修改点:

  • 在示例卷曲中,使用"Content-Type: application/json",并将JSON对象转换为字符串。
  • 您引用的thread使用基本授权,例如-u testtoken123:。这样,就需要使用Utilities.base64Encode。但是在示例curl中,直接使用了API密钥。
    • 我认为这可能是错误消息的原因。

当以上几点反映到您的脚本时,它如下所示。

修改后的脚本:

从:
var options = {
'method' : 'post',
'payload' : data,
'headers': getAuthHeader()['headers']
};
至:
var apiKey = "SOME-API-KEY";
var options = {
  'method' : 'post',
  'payload' : JSON.stringify(data),
  'headers': {Authorization: apiKey},
  'contentType': "application/json",
};
  • 在这种情况下,不使用getAuthHeader()

注意:

  • 此修改后的脚本的请求与您的示例curl命令相同。但是,在此修改后的脚本中,它假定您的apiKeydata可以用于此API。请注意这一点。

参考: