【问题标题】:Webhooks with Contentful and node带有 Contentful 和节点的 Webhook
【发布时间】:2015-08-07 01:53:16
【问题描述】:

真的很难让这个工作。我在 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 用户名/密码。

如何正确接收传入的 webhook 请求并获取正文内容?

【问题讨论】:

  • 首先:你忘记使用app.listen(#portNumber)。我添加了该行并尝试了来自 contentful-webhook-server 的 curl 示例:curl -X POST --header "X-Contentful-Topic: ContentManagement.Entry.publish" localhost:#portNumber。它对我有用。添加该行后您是否仍然注意到任何问题?
  • @FlorianW。是的,我有app.listen 代码,只是在上面的示例中没有。它接收传入的请求,但该条目未按预期包含在正文中。看起来它应该根据 Contentful 的 API 文档。
  • 您是否尝试过使用req.pipe(process.stdout); 将传入流写入您的控制台?据我从 npm 模块文档中可以看到,传入消息的类型为 nodejs.org/api/http.html#http_http_incomingmessage
  • 您可以尝试将http-body-parse 与 contentful-webhook-server 一起使用吗?由于我没有内容满意的帐户,因此无法单独进行测试。
  • 听起来你在说:站点 1 向站点 2 发送 CGI 请求。站点 2 获取查询字符串内容,但没有获取站点 1 的正文。这不正是 CGI 的工作方式吗?例如,如果“Site 1”是我的网站,而“Site 2”是 Facebook.com,如果我调用他们的 API 之一,我真的希望 Facebook 能够访问我的网页的 BODY 吗?不。很抱歉,如果我不了解 Webhooks,但根据您的描述,这就是它的工作原理。

标签: javascript node.js express webhooks contentful


【解决方案1】:

contentful-webhook-server 不解析请求,这可以解释为什么它不会在回调中将正文传递给您。

您的服务器似乎是正确的,但似乎 contentful 具有 type-is 库无法识别的自定义 json 类型。

内容类型看起来像 'application/vnd.contentful.management.v1+json'

如果您让body-parser 接受此自定义内容类型,您的服务器可能会工作。例如:

app.use(bodyParser.json({type: 'application/*'}));

如果可行,您可以更具体地了解接受的类型。

记录在案:

typeis.is('application/vnd.contentful.management.v1+json', ['json'])
=> false

【讨论】:

    【解决方案2】:

    一个更简单的选择是修改自定义Content-Type,因为我们知道它实际上返回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();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-19
      • 2018-07-15
      • 2023-01-10
      • 2015-03-20
      • 2016-08-26
      • 2016-12-06
      • 2019-04-01
      • 2012-08-18
      相关资源
      最近更新 更多