2015-05-25 16 views
9

Thực sự đấu tranh để làm việc này. Tôi có một thiết lập định nghĩa webhook trong Contentful. Khi tôi xuất bản một mục trong Contentful, nó sẽ gửi một yêu cầu HTTP POST tới webhooks.example.com.Webhooks với Contentful và nút

Tại subdomain mà tôi có một máy chủ NodeJS chạy chấp nhận yêu cầu. Tôi đã xem số Contentful API docs, cho biết cơ thể yêu cầu phải chứa mục mới được xuất bản.

Tôi đã thử 2 phương pháp nhận được yêu cầu, không phải trong số đó được đem lại cho tôi bất cứ điều gì cho cơ thể theo yêu cầu. Đầu tiên tôi đã cố gắng module 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); 
}); 

Ở đây, yêu cầu đi qua và tôi nhận được thông báo An entry was published nhưng req.body là undefined. Nếu tôi làm console.log(req) thay vào đó, tôi có thể thấy đối tượng yêu cầu đầy đủ, không bao gồm nội dung.

Vì vậy, tôi sau đó đã cố gắng chạy một máy chủ cơ bản Express để chấp nhận tất cả các yêu cầu 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); 
}); 

Một lần nữa với điều này, tôi nhận được thông Incoming request nhưng req.body trống. Tôi biết phương pháp này là sai vì tôi chưa sử dụng tên người dùng/mật khẩu webhook của mình.

Làm thế nào để tôi nhận được một cách chính xác các yêu cầu webhook đến và nhận được nội dung cơ thể?

+0

Trước hết: Bạn quên sử dụng 'app.listen (#portNumber)'. Tôi đã thêm dòng đó và thử ví dụ 'curl' từ contentful-webhook-server:' curl -X POST - tiêu đề "X-Contentful-Topic: ContentManagement.Entry.publish" localhost: # portNumber'. Nó làm việc cho tôi. Bạn vẫn nhận thấy bất kỳ vấn đề nào sau khi thêm dòng đó? – Dodekeract

+0

@FlorianW. Có, tôi có mã 'app.listen', không có trong ví dụ trên. Nó nhận được các yêu cầu đến, nhưng mục nhập không được bao gồm trong cơ thể như mong đợi. Dường như nó phải theo tài liệu API cho Contentful. – Coop

+0

bạn đã thử viết luồng đến vào bảng điều khiển của mình bằng cách sử dụng 'req.pipe (process.stdout);' chẳng hạn? Tin nhắn đến có kiểu https://nodejs.org/api/http.html # http_http_incomingmessage theo như tôi thấy từ tài liệu mô-đun npm .. –

Trả lời

8

Các contentful-webhook-server không phân tích req do đó sẽ giải thích lý do tại sao nó không cung cấp cho cơ thể bạn trong khi gọi lại.

Máy chủ của bạn có vẻ đúng nhưng có vẻ như nội dung có loại json tùy chỉnh không được nhận dạng bởi thư viện type-is.

các content-type trông giống như 'application/vnd.contentful.management.v1 + json'

máy chủ của bạn có thể sẽ có tác dụng nếu bạn thực hiện body-parser chấp nhận kiểu nội dung tùy chỉnh này. Ví dụ:

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

Nếu công trình này, bạn có thể cụ thể hơn về các loại chấp nhận.

Đối với hồ sơ:

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

Câu trả lời hoàn hảo +1 – sidonaldson

0

Một lựa chọn dễ dàng hơn là để thay đổi tùy chỉnh Content-Type kể từ khi chúng ta biết nó thực sự trở JSON. Chỉ cần dán mã này vào một nơi nào đó phía trên 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(); 
}); 
Các vấn đề liên quan