реализация подписки webhook в ресурс API - PullRequest
0 голосов
/ 14 декабря 2018

Рассмотрим следующий ресурс vanilla api со следующими маршрутами:

`POST` `{{baseurl}}/api/v1/users`    
//with request body of 
{
    "username":"adam12",
    "password":"abc123"
}

`GET` `{{baseurl}}/api/v1/users`   
`GET` `{{baseurl}}/api/v1/users/:id`   
`PUT` `{{baseurl}}/api/v1/users/:id`   
`DELETE` `{{baseurl}}/api/v1/users/:id`

, где {{baseurl}} равно localhost:3000.

У меня есть код для работающей реализации этого здесь: https://github.com/mmcguff/webhookLearning

На этом этапе клиенты, взаимодействующие с этим ресурсом users, должны отправлять GET запросы, чтобы их узналиизменений в этих ресурсах.Если вам нужны данные в реальном времени с этого ресурса, вам придется создать цикл опроса, который потребляет ресурсы на клиенте на сервере, отвечающем на эти запросы.

Я знаю, что правильное решение этой проблемы заключается в реализации подписки на веб-крюки для этого ресурса, но я не нашел четкой информации о типе передовой практики о том, как это сделать, в файле node.js.Пакет, который я нашел в npm, сейчас загружен очень мало, что наводит меня на мысль, что должны быть лучшие способы, которыми пользуются другие.

Любая помощь по переходу с vanilla API на API webhook была бы полезна для меня и всех членов сообщества.

1 Ответ

0 голосов
/ 19 декабря 2018

Обычно для этого типа вещей используют очередь.GitHub, например, с открытым исходным кодом для Ruby с именем resque давно.В частности, в Node вы можете посмотреть на bull .Bull использует Redis для хранения событий в очереди, похожих на resque.Рабочие подписываются на события, которые им небезразличны, и обрабатывают их соответствующим образом.

Теперь приведем практический, но ограниченный пример для вашего варианта использования:

const Queue = require('bull');
const rp = require('request-promise');

const userQueue = new Queue('user');

app.post(`/v1/users`, (req, res) => {
  userQueue.add({username: req.body.username, email: req.body.email});
  return res.send(`OK`);
});

const userSubscribers = [
  {
    hookUrl: `http://example.com/user-hook`
  }
];

userQueue.process(job => {
  return Promise.all(userSubscribers.map(subscriber => {
    const options = {
      method: `POST`,
      uri: subscriber.hookUrl,
      body: job.data,
      json: true
    };
    return rp(options);
  });
});

Для различных компромиссов вы можете использовать Kafka вместо webhooks.

...