Скрипт Google Apps для создания страницы слияния — выдает код состояния 500

#google-apps-script #confluence-rest-api

#google-apps-script #confluence-rest-api

Вопрос:

Примечание: Я также разместил этот вопрос на форуме Atlassian здесь: https://community.atlassian.com/t5/Confluence-questions/Google-Apps-Script-to-Create-Confluence-Page-HTTP-500-Error/qaq-p/1039040#M66094

Я обращаюсь к более широкой аудитории здесь, на SO.

Я использую следующий код скрипта Google Apps в таблице Google для создания страницы слияния:

 headers = {"Authorization" : "Basic "   Utilities.base64Encode(user   ':'   
pswd), "Content-Type": "application/json"};

url = "https://confluence.asdf.com/rest/api/content/";
var params = { 
  "method":"POST",
  "headers":headers,
  "muteHttpExceptions": false,
  "type":"page",
  "title":newTitle,
  "space":{"key":"DOC"},
  "body":{"storage":{"value": "<p>This is <br/> a new page</p>" }, 
  "representation":"storage"} 
};
var createResponse = UrlFetchApp.fetch(url, params); 
  

Однако, когда я отправляю запрос, я получаю этот ответ:

 Request failed for https://confluence.atlas.asdf.com/rest/api/content/ 
returned code 500.
Truncated server response: {"statusCode":500,"
message":"<?> No content to map to Object due to end of 
input","reason":"Internal Server Error"} (use muteHttpExceptions option to 
examine full response)
  

Я понимаю, что есть образцы curl, которые я видел, но они мне не помогают.
Что я делаю не так?

Редактировать: 25 марта @Tanaike Я изменил код, как вы предложили:

     headers = {"Authorization" : "Basic "   Utilities.base64Encode(user   ':'   pswd) };


    var payload = {
      "type": "page",
      "title": newTitle,
      "space": {"key": "DOC"},
      "body": {
        "storage": {
          "value": "<p>This is <br/> a new page</p>"
        },
        "representation": "storage"
      }
    };
    var params = { 
      "method": "POST",
      "headers": headers,
      "muteHttpExceptions": false,
      "payload": JSON.stringify(payload),
      "contentType": "application/json"
    };

    var createResponse = UrlFetchApp.fetch(url, params);        
  

Я получаю ту же ошибку, что и раньше.

Ответ №1:

Как насчет этой модификации?

Модифицированный сценарий:

Пожалуйста, измените params следующим образом и протестируйте еще раз. Судя по сообщению об ошибке в вашем вопросе, тело запроса было передано в свойство payload .

 var payload = {
  "type": "page",
  "title": newTitle,
  "space": {"key": "DOC"},
  "body": {
    "storage": {
      "value": "<p>This is <br/> a new page</p>"
    },
    "representation": "storage"
  }
};
var params = { 
  "method": "POST",
  "headers": headers,
  "muteHttpExceptions": false,
  "payload": JSON.stringify(payload)
};
  

Примечание:

  • Эта модификация предполагает, что каждое значение в payload и headers является правильным.
  • "Content-Type": "application/json" заголовки in также могут быть вставлены params как "contentType": "application/json" .

Ссылки:

Я не могу протестировать это изменение. Итак, если это не сработало, можете ли вы предоставить сообщение об ошибке? Я хотел бы подумать об этой проблеме.

Редактировать:

Из официального документа кажется, что свойство body является "body":{"storage":{"value":"<p>This is a new page</p>","representation":"storage"}}} . Поэтому, пожалуйста, измените следующим образом.

Модифицированный скрипт:

 headers = {"Authorization" : "Basic "   Utilities.base64Encode(user   ':'   pswd) };
var payload = {
  "type": "page",
  "title": newTitle,
  "space": {"key": "DOC"},
  "body": {
    "storage": {
      "value": "<p>This is <br/> a new page</p>",
      "representation": "storage" // Modified
    }
  }
};
var params = { 
  "method": "POST",
  "headers": headers,
  "muteHttpExceptions": false,
  "payload": JSON.stringify(payload),
  "contentType": "application/json"
};
var createResponse = UrlFetchApp.fetch(url, params);
  

Примечание:

  • В моей среде я мог подтвердить, что результат был таким же, как в официальном примере скрипта. Если это не сработало, пожалуйста, подтвердите каждое значение payload и headers еще раз.

Комментарии:

1. @Steve Murphy Приношу извинения за доставленные неудобства. Я заметил, что существует проблема со свойством body . Итак, не могли бы вы, пожалуйста, подтвердить это?

2. Я внедрил ваши изменения, и скрипт работает. Только одна проблема: когда я создаю страницу, она видна только на моей панели мониторинга, и оттуда мне нужно переместить ее на нужную дочернюю страницу в нужном месте. (Это не оптимально.) Как мне создать страницу таким образом, чтобы она размещалась на дочерней странице в пространстве?

3. @Steve Murphy Спасибо за ответ. Я рад, что ваша первая проблема была решена. Что касается вашей новой проблемы, можете ли вы опубликовать ее как новый вопрос? Потому что ваш первоначальный вопрос заключается в устранении ошибки вашего скрипта, а ваша новая проблема связана со спецификацией API. Это отличается от первого. Поэтому, пожалуйста, закройте этот вопрос и опубликуйте свою новую проблему как новый вопрос. При публикации нового вопроса, пожалуйста, указывайте подробную информацию. Благодаря этому он будет полезен другим пользователям, у которых такая же проблема. Я рад, если вы можете сотрудничать для решения вашей проблемы.

4. Чтобы поместить страницу в нужное место, добавьте это в полезную нагрузку: «ancestors»:[{«id»:<идентификатор родительской страницы>}] И спасибо, что помогли мне. Я действительно ценю потраченное вами время.!

5. Это самое близкое, что я нашел к моей проблеме, но вместо создания страницы слияния я хотел бы получить страницу слияния на основе ID и получить результат в формате Json, чтобы я мог проанализировать основное содержимое confluence. @SteveMurphy не могли бы вы дать какой-нибудь намек на то, как это сделать? Спасибо