9

これを機能させるのに本当に苦労しています。Contentful で Webhook 定義をセットアップしました。Contentful でエントリを公開すると、HTTP POST リクエストが webhooks.example.com に送信されます。

そのサブドメインで、リクエストを受け入れるために 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)代わりに、本文を含まない完全なリクエスト オブジェクトを表示できます。

そこで、すべての POST リクエストを受け入れる基本的な Express サーバーを実行してみました。

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 リクエストを正しく受信し、本文のコンテンツを取得するにはどうすればよいですか?

4

2 に答える 2

14

contentful-webhook-serverreq を解析しないため、コールバックで本文が配信されない理由が説明されます。

あなたのサーバーは正しいようですが、 contentful にはtype-isライブラリによって認識されないカスタム json タイプがあるようです。

content-type は「application/vnd.contentful.management.v1+json」のようになります

body-parserこのカスタム コンテンツ タイプを受け入れれば、サーバーはおそらく動作します。例えば ​​:

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

これが機能する場合は、受け入れられたタイプをより具体的にすることができます。

記録のために :

typeis.is('application/vnd.contentful.management.v1+json', ['json'])
=> false
于 2015-06-02T15:17:39.590 に答える
0

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();
});
于 2016-05-17T11:58:40.273 に答える