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

GAS: Error 401 while connecting to an API

我正在尝试连接到 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 中创建脚本以将信息返回到电子表格。

基于这个问题:

我修改了我的代码如下:

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;
 }

现在我得到的新错误是:

Exception: Request failed for https://api.cloudwaitress.com returned code 401. Truncated server response: {"outcome":1,"message":"Invalid Authentication"} (use muteHttpExceptions option to examine full response)

我认为这是一个很大的进步,因为我之前遇到过 500 错误。

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

感谢您的宝贵时间。

这个修改怎么样?

修改点:

  • 在您的示例 curl 中,使用了 "Content-Type: application/json",并且 JSON 对象被转换为字符串。
  • 您提到的使用了像-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。请注意这一点。

参考: