2015-05-25 2 views
9

Действительно изо всех сил пытаюсь заставить эту работу работать. У меня есть настройка определения webhook в Contentful. Когда я публикую запись в Contentful, он отправляет запрос HTTP POST на webhooks.example.com.Веб-камеры с содержанием и узлом

В этом субдомене у меня есть сервер NodeJS, работающий для принятия запроса. Я просмотрел Contentful API docs, в котором говорится, что орган запроса должен содержать недавно опубликованную запись.

Я пробовал 2 метода получения запроса, ни один из которых не дает мне ничего для тела запроса. Сначала я попробовал модуль contentful-webhook-server НПМ:

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 requestreq.body но пуст. Я знаю, что этот метод неверен, потому что я не использовал имя пользователя/пароль для веб-хостинга.

Как правильно получать входящие запросы веб-камеры и получать содержимое тела?

+0

Прежде всего: Вы забыли использовать 'app.listen (#portNumber)'. Я добавил эту строку и попробовал пример 'curl' из contentful-webhook-сервера:' curl -X POST -header 'X-Contentful-Topic: ContentManagement.Entry.publish "localhost: # portNumber'. Это сработало для меня. Вы еще заметили какие-либо проблемы после добавления этой строки? – Dodekeract

+0

@FlorianW. Да, у меня был код 'app.listen', только не в моем примере выше. Он получает входящие запросы, но запись не включена в тело, как ожидалось. Похоже, он должен соответствовать документам API для Contentful. – Coop

+0

Вы пытались записать входящий поток на консоль, используя 'req.pipe (process.stdout);' например? Входящее сообщение имеет тип https://nodejs.org/api/http.html # http_http_incomingmessage, насколько я могу видеть из документов модуля npm .. –

ответ

8

contentful-webhook-server не анализирует req так, чтобы он объяснял, почему он не доставляет тело вам в обратном вызове.

Ваш сервер кажется правильным, но кажется, что у контентного контента есть пользовательский тип json, который не распознается библиотекой type-is.

тип содержимого выглядит как «приложение/vnd.contentful.management.v1 +» JSON

ваш сервер вероятно, будет работать, если вы сделаете body-parser принимать этот тип пользовательского контента. Например:

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

Если это работает, вы можете быть более конкретным по принятому типу.

Для записи:

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

Идеальный ответ +1 – sidonaldson

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(); 
});