我正在尝试捕获由node.js中的Aftership API发出的PUT / webhook请求。每次需要推送通知时都会发出PUT请求,我正在使用Parse发送通知,但我需要来自webhook的一些数据。
webhook的标题看起来像Content-Type: application/json
并包含以下数据:
ts - 事件发生的UTC unix时间戳
event - 事件的名称(对于跟踪更新,值将为 'tracking_update')
msg - 有关事件发生的消息的详细信息 格式如下。
如何在节点或js的自定义字段字典中获取跟踪号,slug和token
的值?
{
"event": "tracking_update",
"msg": {
"id": "53aa94fc55ece21582000004",
"tracking_number": "906587618687",
"title": "906587618687",
"origin_country_iso3": null,
"destination_country_iso3": null,
"shipment_package_count": 0,
"active": false,
"order_id": null,
"order_id_path": null,
"customer_name": null,
"source": "web",
"emails": [],
"custom_fields": {},
"tag": "Delivered",
"tracked_count": 1,
"expected_delivery": null,
"signed_by": "D Johnson",
"shipment_type": null,
"tracking_account_number": null,
"tracking_postal_code": "DA15BU",
"tracking_ship_date": null,
"created_at": "2014-06-25T09:23:08+00:00",
"updated_at": "2014-06-25T09:23:08+00:00",
"slug": "dx",
"unique_token": "xk7LesjIgg",
"checkpoints": [{
"country_name": null,
"country_iso3": null,
"state": null,
"city": null,
"zip": null,
"message": "Signed For by: D Johnson",
"coordinates": [],
"tag": "Delivered",
"created_at": "2014-06-25T09:23:11+00:00",
"checkpoint_time": "2014-05-02T16:24:38",
"slug": "dx"
}]
},
"ts": 1403688191
}
答案 0 :(得分:2)
可以使用Express
框架完成,例如:
var express = require('express'),
bodyParser = require('body-parser'),
app = express(),
port = 3000;
app.use(bodyParser.json());
app.post('/', function (req, res) {
var body = req.body;
var trackingNumber = body.msg.tracking_number;
var slug = body.msg.slug;
var token = body.msg.unique_token;
console.log(trackingNumber, slug, token);
res.json({
message: 'ok got it!'
});
});
var server = app.listen(port, function () {
var host = server.address().address
var port = server.address().port
console.log('Example app listening at http://%s:%s', host, port)
});
以下是GIT repository,只需将其克隆并执行npm install
然后npm start
。服务器将在端口3000
上运行:D
注意:我在Afterhip Webhook的文档中看到,它说他们会请求POST
HTTP方法,而不是PUT
所以我创建了post
请求的示例。如果您希望它抓住put
请求,请将其替换为put
。
答案 1 :(得分:2)
为了检查webhooks数据,我建议将每个请求存储在数据库中,然后查询数据库。由于每个请求都不同,最简单的方法是在sails.js中创建API(Node.js框架,易于使用的ORM)。
sudo npm install sails -g
sails new _project_name_
cd _project_name_
sails generate api Records
使用last命令,sails生成了控制器和模型来存储您的webhook数据。
我建议安装pm2以运行应用。你可以用
运行它pm2 start app.js
接下来,您应该在Aftership中配置您的webhook以获取以下网址:
YOUR_SERVER_IP:PORT /记录/创建
您可以按照以下网址检查数据:
YOUR_SERVER_IP:PORT /记录/查找
如果要解析数据,可以在RecordsController.js中完成,例如:
Parsing: function(req, res) {
Records.find({}).exec(function(err, results) {
var output = [];
while (results.length) {
var result = results.pop();
//custom parsing goes here
//example:
output.push({
tracking_number: result.msg.tracking_number,
slug: result.msg.slug,
unique_token: result.msg.unique_token
});
}
return res.json(output);
});
},
您可以通过以下网址调用此方法: YOUR_SERVER_IP:PORT /记录/解析
我在Codeanywhere创建了用于演示的项目
webhook端点是: http://port-1337.zavtt4t8a0jm7vigncyo3txxmuhxgvix3yxk66pvydgqfr.box.codeanywhere.com/records/create
要检查数据,只需将/ url的部分替换为/ find
git repo在这里:https://github.com/dkatavic/webhook_for_aftership
您可以在服务器上克隆项目并运行它(或使用我的服务器进行测试)
答案 2 :(得分:1)
您可以通过
捕获PUT请求app.put('/someRouteToCatchWebHook', function(request, response) {
//webhook parsing goes here
});
(我确定您在代码中使用了expressjs - 有关详细信息,请参阅http://expressjs.com/api.html#app.METHOD。)
如果webhook数据在请求正文中,您可以使用https://www.npmjs.com/package/body-parser模块进行解析。