【问题标题】:Accessing a Capsule CRM API using Google App Script (convert from Curl Req)使用 Google App Script 访问 Capsule CRM API(从 Curl Req 转换)
【发布时间】:2017-04-20 10:33:34
【问题描述】:

我正在尝试访问胶囊 CRM API(文档here

我对 google app 脚本很陌生,我正在尝试使用 UrlFetchApp 将 curl 请求转换为 gas 函数

我正在尝试通过 API 搜索某一方——他们提供了这个端点:

获取

https://api.capsulecrm.com/api/v2/parties/search

这些是请求中的搜索参数:

  • q _________Type(String)___:要搜索的值,例如一个名字
  • page______Type(Integer)__:要返回的结果页
  • perPage___Type(Integer)__:每页返回的实体数

他们的 API 文档说您可以通过执行以下操作从 API 读取数据:

curl -H "Authorization: Bearer {token}" 
     -H "Accept: application/json" 
     https://api.capsulecrm.com/api/v2/parties

以下是我的气体函数,它确实返回了数据,但没有有效地搜索正确的记录并只返回结果集。我想知道是否有更简单更好的方法来执行此搜索?

function curlRequest(partyid) {

  var authenticationToken = "XvDEdg652DG...xYYRg";
  //var url = "https://api.capsulecrm.com/api/v2/parties";
  var url = "https://api.capsulecrm.com/api/v2/parties/search";
  var headers = {
    "Authorization" : "Bearer " + authenticationToken,
  };

  var payload = {  
    "Accept": "application/json",
    "q":{
      "id":101756643
    },
     "page":1,
     "perPage": 50,
  };

  var options = {
    "headers" : headers,
    "method" : "GET"
  };

  Logger.log(options);
  Logger.log(UrlFetchApp.fetch(url, options));
  //var data = JSON.parse(response.getContentText());
}

编辑:基于 Jack Brown 的反馈:

似乎建议是正确的,但是 Capsule API 不适合这种结构:

【问题讨论】:

    标签: curl google-apps-script get


    【解决方案1】:

    如果payload 包含在options 中,那么fetch 将发出POST 请求即使您指定了method: 'get'。这解释了为什么您会收到来自 API 的 “不允许的方法” 错误 - “/api/v2/parties/search”端点只接受 GET 请求而不接受 POST。

    因此,这意味着对于 GET 请求,搜索查询应包含在 URL 中,而不是有效负载中。最好自己控制转义,而不是使用UrlFetchApp 提供的转义 - 这将允许搜索词中的任何特殊字符。 GET 是默认方法,因此可以从 options 中省略。

    进行这些更改,代码变为:

    function myFunction() {
      var authenticationToken = "XvDEdg652DG...xYYRg";
    
      var query = "your search";
      var url = "https://api.capsulecrm.com/api/v2/parties/search?q=" + 
        encodeURIComponent(query);
    
      var headers = {
        "Authorization" : "Bearer " + authenticationToken,
        "Accept": "application/json"
      };
    
      var options = {
        headers: headers,
        escaping: false
      };
    
      Logger.log(UrlFetchApp.fetch(url, options));    
    }
    

    【讨论】:

      【解决方案2】:

      您永远不会将有效负载传递给 urlFetch 方法,而是创建有效负载。但是,您需要像这样在选项对象中插入有效负载:

      var options = {
          "headers" : headers,
          "method" : "GET",
          "payload" : payload
        };
      

      curl中的-H也是一个header的值,所以"Accept": "application/json"应该定义在header中

      var headers = {
          "Authorization" : "Bearer " + authenticationToken,
          "Accept": "application/json"
        }
      

      最后,您的有效载荷将如下所示:

      var payload = {  
          "q":{
            "id":101756643
          },
           "page":1,
           "perPage": 50,
        };
      

      现在,当您进行 urlfetch 调用时,它应该可以正常工作。

      Logger.log(UrlFetchApp.fetch(url, options))
      

      希望对您有所帮助!

      【讨论】:

      • 感谢您的全面协助 - 您帮助我更好地理解了结构
      • 你能把payload修改成这个:var payload = { "q":101756643, "page":1, "perPage": 50, };再试一次吗?
      • 也好像按标签搜索仍然是not documented。所以不能真正说出正确的语法或结构!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      相关资源
      最近更新 更多