Базовый лагерь сценариев Google Apps POST

Я перепробовал все комбинации, которые только мог придумать, чтобы это сработало. Что мне нужно отправить в New Basecamp API в виде поля POST, чтобы он принял мои данные 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 ([email protected])",
                           "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 ([email protected])",
                   "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>


person Matteo Stohlman    schedule 19.03.2013    source источник


Ответы (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 как задокументировано здесь

Вот рабочий образец -

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);
}
person Arun Nagarajan    schedule 19.03.2013
comment
Это работает для создания нового проекта, но по какой-то причине не для редактирования существующего проекта. - person Matteo Stohlman; 19.03.2013
comment
Вы не должны получить указанную ошибку, если это так. Вы получаете другую ошибку - она ​​не должна касаться недопустимого символа в тексте json. - person Arun Nagarajan; 19.03.2013
comment
Обновлен пример кода. Вам нужно использовать put против post. Это стандартное соглашение REST для обновления ресурса. - person Arun Nagarajan; 19.03.2013
comment
Это смущает. Спасибо. - person Matteo Stohlman; 19.03.2013
comment
Не волнуйтесь. Возможно, вы захотите использовать автономный инструмент REST, подобный этому, для браузера Chrome: chrome.google.com/webstore/detail/postman-rest-client/, чтобы проверить все ваши индивидуальные сообщения, прежде чем переносить их в скрипт приложений. Таким образом, вы можете разложить логику вашего скрипта приложений (если есть) с помощью стандартных вопросов REST. - person Arun Nagarajan; 19.03.2013