如何告诉 webhook 'unpublish()' 订单来自 API,而不是 Contentful 控制台?
How to tell the webhook the 'unpublish()' order comes from the API, not the Contentful console?
我使用这个 (感谢@Robban)通过 API 发布内容条目,而不触发网络钩子。
但是,我无法弄清楚如何在不触发 webhook 的情况下通过 API 取消发布条目。
根据 Contentful 文档,要通过 API 取消发布条目,它是这样的:
client.getSpace('<space_id>')
.then((space) => space.getEntry('<entry_id>'))
.then((entry) => entry.unpublish())
由于 <entry_id>
是唯一的有效载荷,我如何向 webhook 指示它不应像往常一样进行,因为它是一个 API 调用?
不幸的是,直接来自 API 的调用与来自 Web 应用程序的调用没有区别。 Web 应用程序在幕后执行此调用。
此外,在取消发布的情况下,您的 webhook 唯一会收到的是一个不包含任何字段的删除对象。这意味着上一个答案中显示的技巧在这里不适用。
我能想到的解决这个问题的唯一方法是再次调用某个数据存储(可能是 Contentful)并将条目 ID 和一些时间戳放入其中。然后,您的 webhook 可以在收到取消发布事件后查询此数据存储,并查看是否应继续处理,或者取消发布是否似乎是通过网络应用程序完成的。
基本上是这样的:
client.getSpace('<space_id>')
.then((space) => space.getEntry('<entry_id>'))
.then((entry) => {
otherService.SetUnpublishedThroughManualAPICall(entry.sys.id);
entry.unpublish();
})
然后在你的 webhook 中添加一些伪代码:
function HandleUnpublish(object entry) {
if(OtherService.CheckIfManualUnpublish(entry.sys.id)){
//Do some processing...
}
}
您可以选择使用 Contentful 中的一个字段作为您的商店。在这种情况下,您将在取消发布之前设置此字段。像这样:
client.getSpace('<space_id>')
.then((space) => space.getEntry('<entry_id>'))
.then((entry) => {
entry.fields['en-US'].unpublishedTroughApi = true;
entry.update();
})
.then((entry) => entry.unpublish())
然后在您的 webhook 中,您必须通过管理 API 再次获取条目并检查该字段。请记住,这会导致对 Contentful 的额外 API 次调用。
我使用这个
但是,我无法弄清楚如何在不触发 webhook 的情况下通过 API 取消发布条目。
根据 Contentful 文档,要通过 API 取消发布条目,它是这样的:
client.getSpace('<space_id>')
.then((space) => space.getEntry('<entry_id>'))
.then((entry) => entry.unpublish())
由于 <entry_id>
是唯一的有效载荷,我如何向 webhook 指示它不应像往常一样进行,因为它是一个 API 调用?
不幸的是,直接来自 API 的调用与来自 Web 应用程序的调用没有区别。 Web 应用程序在幕后执行此调用。
此外,在取消发布的情况下,您的 webhook 唯一会收到的是一个不包含任何字段的删除对象。这意味着上一个答案中显示的技巧在这里不适用。
我能想到的解决这个问题的唯一方法是再次调用某个数据存储(可能是 Contentful)并将条目 ID 和一些时间戳放入其中。然后,您的 webhook 可以在收到取消发布事件后查询此数据存储,并查看是否应继续处理,或者取消发布是否似乎是通过网络应用程序完成的。
基本上是这样的:
client.getSpace('<space_id>')
.then((space) => space.getEntry('<entry_id>'))
.then((entry) => {
otherService.SetUnpublishedThroughManualAPICall(entry.sys.id);
entry.unpublish();
})
然后在你的 webhook 中添加一些伪代码:
function HandleUnpublish(object entry) {
if(OtherService.CheckIfManualUnpublish(entry.sys.id)){
//Do some processing...
}
}
您可以选择使用 Contentful 中的一个字段作为您的商店。在这种情况下,您将在取消发布之前设置此字段。像这样:
client.getSpace('<space_id>')
.then((space) => space.getEntry('<entry_id>'))
.then((entry) => {
entry.fields['en-US'].unpublishedTroughApi = true;
entry.update();
})
.then((entry) => entry.unpublish())
然后在您的 webhook 中,您必须通过管理 API 再次获取条目并检查该字段。请记住,这会导致对 Contentful 的额外 API 次调用。