【问题标题】:Google Apps Script Basecamp POSTGoogle Apps 脚本大本营 POST
【发布时间】:2013-03-20 02:04:50
【问题描述】:

我已经尝试了所有我能想到的组合来完成这项工作。我需要将什么作为 POST 字段发送到 New Basecamp API 以使其接受我的 POST 数据?

我的代码是:

function getFilterBy() {
    var url = "https://basecamp.com/****/api/v1/projects/*****.json";
    var payload =  {"name" : "myapp", "description" : "no desc mls"};
    var opt = {
               "contentType" : "application/json",
               "method" : "POST",
               "headers":{ "User-Agent": "myapp (user@somewhere.com)",
                           "Authorization" :"Basic " + Utilities.base64Encode("user" + ":" + "pass")},
               "validateHttpsCertificates" :false,
               "muteHttpExceptions" : true,
               "payload" : payload
               };
    var response = UrlFetchApp.fetch(url, opt);
    var text = response.getContentText();
    Logger.log(text);
    }

我的错误是:

lexical error: invalid char in json text.
                                   description=no+desc+mls&name=Ho
                 (right here) ------^

我试过Utilities.jsonStringify,但没有运气。我知道这是一个菜鸟错误,但我就是想不通。如果有一个地方你知道我也可以从哪里获得这些信息,那将是惊人的。

谢谢!

更新 1

function getFilterBy() {
       var url = "https://basecamp.com/****/api/v1/projects/****.json";
       var payload =  {name : 'myApp Change'};
       var opt = {
                   "contentType" : "application/json",
                   "method" : "POST",
                   "headers":{ "User-Agent": "myApp (user@ex.com)",
                   "Authorization" :"Basic " + Utilities.base64Encode("user" + ":" + "pass")},
                   "validateHttpsCertificates" :false,
                   "muteHttpExceptions" : true,
                   "payload" : Utilities.jsonStringify(payload)
                    };
        var response = UrlFetchApp.fetch(url, opt);
        var text = response.getContentText();
        Logger.log(text);
        }

产量错误:

<body>
    <div class="dialog">
     <div class="innercol">
       <h1>Hmm, that isn&rsquo;t right</h1>
       <h2>You may have typed the URL incorrectly.</h2>
       <p>Check to make sure you&rsquo;ve got the spelling, capitalization, etc. exactly right.</p>
     </div>
    </div>
    <p id="back" class="back">
      <a href="javascript:window.history.back();">&larr; Back to previous page</a>
    </p>
    <script type="text/javascript">
        if (window.history.length <= 1) document.getElementById("back").style.display = "none";
    </script>
    </body>

【问题讨论】:

    标签: api google-apps-script basecamp


    【解决方案1】:

    你确定你用 JSON.stringify 试过了吗?此示例在 Basecamp 中正确地为我创建了一个项目,并在 POST 有效负载中指定了项目名称/描述。

    注意,我写得很快,不包括 UserAgent - 你需要把它放回去。

    function createProject() { 
      var user = 'USERNAME';
      var password = 'PASSWORD'
      var accoundId = 'ACCOUNTID#';
    
      var url = 'https://basecamp.com/'+accoundId+'/api/v1/projects.json';  
      var payload =  {name : 'new project', description : 'my project description'};
      var opt = {
        contentType : 'application/json',
        method : 'post',
        headers:{Authorization :"Basic " + Utilities.base64Encode(user + ':' + password)},
        validateHttpsCertificates :false,
        muteHttpExceptions : true,
        payload : JSON.stringify(payload)
      };
    
      var response = UrlFetchApp.fetch(url, opt);
      var text = response.getContentText();
      Logger.log(text);
    }
    

    为了更新项目,您必须在此处使用put 动词而不是post 作为documented

    这是一个工作示例 -

    function updateProject() { 
      var projectId = '2413370';
      var url = 'https://basecamp.com/'+accoundId+'/api/v1/projects/'+projectId+'.json';  
      var payload =  {name : 'new project', description : 'my new new project description'};
      var opt = {
        contentType : 'application/json',
        method : 'put',
        headers:{Authorization :"Basic " + Utilities.base64Encode(user + ':' + password)},
        validateHttpsCertificates :false,
        muteHttpExceptions : true,
        payload : JSON.stringify(payload)
      };
    
      var response = UrlFetchApp.fetch(url, opt);
      var text = response.getContentText();
      Logger.log(text);
    }
    

    【讨论】:

    • 这确实可以创建一个新项目,但由于某种原因不能编辑现有项目。
    • 如果是这种情况,您不应该收到您指定的错误。你得到一个不同的错误 - 它不应该是关于“json文本中的无效字符”。
    • 更新了示例代码。您需要使用“put”与“post”。这是更新资源的标准 REST 约定。
    • 这很尴尬。谢谢。
    • 不用担心。您可能希望在 Chrome 浏览器中使用像这样的独立 REST 工具 - chrome.google.com/webstore/detail/postman-rest-client/… 来测试您的所有个人通信,然后再将该流移动到 Apps 脚本中。这样您就可以使用标准 REST 问题分解您的 Apps 脚本逻辑(如果有)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多