带有 Contentful 和节点的 Webhook
Webhooks with Contentful and node
真的很难让它工作。我在 Contentful 中有一个 webhook 定义设置。当我在 Contentful 中发布条目时,它会向 webhooks.example.com.
发送一个 HTTP POST 请求
在那个子域我有一个 NodeJS 服务器 运行 接受请求。我查看了 Contentful API docs,它说请求正文应包含新发布的条目。
我已经尝试了 2 种接收请求的方法,但都没有为请求正文提供任何信息。首先我尝试了 contentful-webhook-server NPM 模块:
var webhooks = require("contentful-webhook-server")({
path: "/",
username: "xxxxxx",
password: "xxxxxx"
});
webhooks.on("ContentManagement.Entry.publish", function(req){
console.log("An entry was published");
console.log(req.body);
});
webhooks.listen(3025, function(){
console.log("Contentful webhook server running on port " + 3025);
});
此处请求通过,我收到消息 An entry was published
但 req.body
未定义。如果我改为 console.log(req)
,我可以看到完整的请求对象,其中不包括正文。
然后我尝试 运行 一个基本的 Express 服务器来接受所有 POST 请求:
var express = require("express"),
bodyParser = require("body-parser"),
methodOverride = require("method-override");
var app = express();
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("X-HTTP-Method-Override"));
app.post("/", function(req, res){
console.log("Incoming request");
console.log(req.body);
});
同样,我收到 Incoming request
消息,但 req.body
是空的。我知道这个方法是错误的,因为我还没有使用我的 webhook username/password。
如何正确接收传入的 webhook 请求并获取正文内容?
contentful-webhook-server
不解析请求,这样就可以解释为什么它不在回调中将正文传递给您。
您的服务器似乎是正确的,但似乎 contentful 有一个自定义 json 类型,type-is
库无法识别。
内容类型看起来像 'application/vnd.contentful.management.v1+json'
如果您 body-parser
接受此自定义内容类型,您的服务器可能会正常工作。例如:
app.use(bodyParser.json({type: 'application/*'}));
如果可行,您可以更具体地说明可接受的类型。
备案:
typeis.is('application/vnd.contentful.management.v1+json', ['json'])
=> false
一个更简单的选择是修改自定义 Content-Type
,因为我们实际上知道它 returns JSON
。只需将其粘贴在 bodyParser
上方的某处
app.use(function(req, res, next) {
if (req.headers['content-type'] === 'application/vnd.contentful.management.v1+json') req.headers['content-type'] = 'application/json';
next();
});
真的很难让它工作。我在 Contentful 中有一个 webhook 定义设置。当我在 Contentful 中发布条目时,它会向 webhooks.example.com.
发送一个 HTTP POST 请求在那个子域我有一个 NodeJS 服务器 运行 接受请求。我查看了 Contentful API docs,它说请求正文应包含新发布的条目。
我已经尝试了 2 种接收请求的方法,但都没有为请求正文提供任何信息。首先我尝试了 contentful-webhook-server NPM 模块:
var webhooks = require("contentful-webhook-server")({
path: "/",
username: "xxxxxx",
password: "xxxxxx"
});
webhooks.on("ContentManagement.Entry.publish", function(req){
console.log("An entry was published");
console.log(req.body);
});
webhooks.listen(3025, function(){
console.log("Contentful webhook server running on port " + 3025);
});
此处请求通过,我收到消息 An entry was published
但 req.body
未定义。如果我改为 console.log(req)
,我可以看到完整的请求对象,其中不包括正文。
然后我尝试 运行 一个基本的 Express 服务器来接受所有 POST 请求:
var express = require("express"),
bodyParser = require("body-parser"),
methodOverride = require("method-override");
var app = express();
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("X-HTTP-Method-Override"));
app.post("/", function(req, res){
console.log("Incoming request");
console.log(req.body);
});
同样,我收到 Incoming request
消息,但 req.body
是空的。我知道这个方法是错误的,因为我还没有使用我的 webhook username/password。
如何正确接收传入的 webhook 请求并获取正文内容?
contentful-webhook-server
不解析请求,这样就可以解释为什么它不在回调中将正文传递给您。
您的服务器似乎是正确的,但似乎 contentful 有一个自定义 json 类型,type-is
库无法识别。
内容类型看起来像 'application/vnd.contentful.management.v1+json'
如果您 body-parser
接受此自定义内容类型,您的服务器可能会正常工作。例如:
app.use(bodyParser.json({type: 'application/*'}));
如果可行,您可以更具体地说明可接受的类型。
备案:
typeis.is('application/vnd.contentful.management.v1+json', ['json'])
=> false
一个更简单的选择是修改自定义 Content-Type
,因为我们实际上知道它 returns JSON
。只需将其粘贴在 bodyParser
app.use(function(req, res, next) {
if (req.headers['content-type'] === 'application/vnd.contentful.management.v1+json') req.headers['content-type'] = 'application/json';
next();
});