Contentful API возвращает "несоответствие версий" при обновлении записи

Я пытаюсь сделать следующее с API управления контентом для Contentful:

  1. Получить запись (entry1)
  2. Найти другую запись (entry2), используя данные из поля в entry1
  3. Обновить запись1 данными из записи2

Мой код выглядит так:

client.getSpace("xxxxxxxx").then(function(space){
  space.getEntries({
    "content_type": "xxxxxxxx",
    "sys.id": "2KEZYJOgDSeQMCQIE0Oo88",
    "limit": 1
  }).then(function(places){

    //search for relevant category entry
    space.getEntries({
      "content_type": contentType.category,
      "sys.id": places[0].fields.category["en-GB"],
      "limit": 1
    }).then(function(category){

      //update place object
      places[0].fields.categoryNew = {
        "en-GB": [ 
          { sys: { type: "Link", linkType: "Entry", id: category[0].sys.id } } 
        ]
      };        

      //update place
      request({
        method: 'PUT',
        url: 'https://api.contentful.com/spaces/xxxxxxxx/entries/' + places[0].sys.id,
        headers: {
          'Authorization': 'Bearer xxxxxxxx',
          'Content-Type': 'application/vnd.contentful.management.v1+json',
          'X-Contentful-Content-Type': 'xxxxxxxx'
        },
        body: JSON.stringify({fields:places[0].fields})
      }, function (error, response, body) {
        console.log(body);
      });

    });


  });
});

Шаги 1 и 2 работают нормально, но последний шаг, обновляющий исходную запись, продолжает возвращать следующую ошибку:

Response: {
  "sys": {
    "type": "Error",
    "id": "VersionMismatch"
  },
  "requestId": "content-api:2PSSF6RtpSs2YyaaisK2wc"
}

Как мне остановить это? Я перепробовал все, что мог, включая ручное обновление sys.version номер, но при обновлении кажется игнорировать sys данные я предоставляю.

2 ответа

Решение

См. http://docs.contentfulcma.apiary.io/ и раздел под названием "Обновление и блокировка версий".

Вы должны передать версию в качестве параметра заголовка с именем "X-Contentful-Version" с запросом PUT.

Как упоминалось в принятом ответе, вам не хватает заголовка, но, возможно, это не причина проблемы.

Contentful хочет получить «текущую версию» (согласно документации), которая не обязательно совпадает с опубликованной версией. Он хочет проверить, не обновляете ли вы старую версию контента. Как последняя (то есть «текущая») версия, так и опубликованная версия присутствуют в ответе на GET для записи. Убедитесь, что вы используете правильный вариант вX-Contentful-Versionзаголовок, иначе вы получите эту ошибку. Если вы используете один из официальных SDK, он должен сделать это автоматически. Но если вы используете, например, Golang или Curl, вам придется сделать это самостоятельно, как указано выше.

Здесь также может быть запрос PATCH, а не PUT, но это другое дело.

Другие вопросы по тегам