Неожиданная ошибка grunt-http при публикации в Atlassian Confluence API

Попытка создать вики-страницу на вики Atlassian. Ранее я использовал скрипт Python, и этот код работал без проблем:

data = json.dumps({"type":"page", "data":"testData", "title":postTitle,"space":{"key":"EB"}, "body":{"storage":{"value": content,"representation":"storage"}}})
r = requests.post("https://estech.atlassian.net/wiki/rest/api/content/", data=data, headers=headers, auth=(confluenceLogin['username'], confluenceLogin['password']))

Теперь я пытаюсь использовать следующую конфигурацию задачи grunt:

    http: {
        atlassianwiki: {
            options: {
                uri: atlassianURL + "/wiki/rest/api/content/",
                headers: {"Content-Type": "application/json"},
                auth: {
                    "user": confluencelogin,
                    "pass": confluencepass
                },
                method:"POST",
                body: JSON.stringify(wikijson)
            }
        }
    }

с wikijson выглядит так:

wikijson = {
            "type": "page",
            "data": "testData",
            "title": "testtitle",
            "space": {key:"EB"},
            "body": {
                "storage": {
                    "value": "<p>testing posting</p>",
                    "representation": "storage"
                }
            }
        }

И я получаю следующую ошибку, когда эта задача выполняется:

Fatal error: 500 {"statusCode":500, "message":"java.io.EOFException: No content to map to Object due to end of input"}

Немного погуглив, я обнаружил, что некоторые люди утверждают, что исправили это, добавив «--post302» в свою командную строку curl. Но я действительно не знаю и не понимаю, как это применимо здесь.


person z0d14c    schedule 04.11.2014    source источник


Ответы (1)


я боролся с REST API слияния, и в моем случае проблема была в заголовке типа контента, но, похоже, он у вас уже есть.
Я не пытался создать новую страницу, но обновить существующую API Confluence показалось немного немного волшебства для меня, поэтому я просто оставлю здесь все шаги, которые я должен был сделать, прежде чем он начал работать, возможно, один из них поможет вам.

function composeRequest(method) {
  var auth = new Buffer(user + ':' + pass).toString('base64');
  var request = {
  host: 'confluence.myserver.com',
  port: 443,
  contentType: "application/json; charset=utf-8",
  'path': path,
  method: method || "GET",
  headers: {
    'Authorization': 'Basic ' + auth,
    'Content-Type': 'application/json'
  },
  rejectUnauthorized: false,
  requestCert: true,
  agent: false
};


  return request;
}

И оказалось, что запрос на обновление страницы JSON ДОЛЖЕН содержать

  • pageId (даже если он находится внутри пути, его нужно повторить)
  • тип
  • заглавие
  • версия (странно, но ставить надо. 0 или 1, не помню)

И когда ваши данные заполнены, вы должны преобразовать их в строку и заполнить поле типа контента в своем запросе!

data = JSON.stringify(data);
request.headers['Content-Length'] = data.length;
https.request(request, respondHandler)
person Katya Pavlenko    schedule 07.05.2015