Contentful API возвращает "несоответствие версий" при обновлении записи
Я пытаюсь сделать следующее с API управления контентом для Contentful:
- Получить запись (entry1)
- Найти другую запись (entry2), используя данные из поля в entry1
- Обновить запись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, но это другое дело.