Webhooks, czyli zdobywanie haków na strony

Jakiś czas temu zaciekawiły mnie webhaki (webhook, czyli taki HTTP callback), które w swojej prostocie są genialna i bardzo przydatne, a pozwalają na przesyłanie między stronami (aplikacjami) informacji – pozornie nic to odkrywczego, jednak ważny jest tutaj sposób w jaki się to odbywa.

Zapewne teraz pojawią się głosy, że wiele rozwiązań tego typu już istnieje. Mamy przecież RSSy i Atomy. Syndykacja ma jednak swoje minusy. Wymaga aktywności od zarówno nadawcy informacji, jak i odbiorcy. Kiedy subskrybujemy kanał RSS, nasz czytnik musi sprawdzać, czy wydawca kanału nie opublikował czegoś nowego.

Webhaki wymagają aktywności tylko od jednej strony (oczywiście obie muszą być wcześniej skonfigurowane). W dużym uproszczeniu webhaki działają tak:

  1. Serwer publikujący hak informujemy o URLu, na który ma wysłać powiadomienie (zwykle POSTem).
  2. Kiedy serwer ma coś do powiedzenia wysyła na wskazany URL dane.
  3. Nasza aplikacja odbiera POSTa i robi, z tak otrzymanymi informacjami, co chce.

I co w tym rewolucyjnego w porównaniu do wspomnianych mechanizmów syndykacji? Webhaki działają w czasie rzeczywistym, czyli mogą publikować informacje w momencie, kiedy coś się dzieje. Najfajniejsze w całym pomyśle jest to, że nawet nie potrzebujemy do tego specyfikacji, bo wszystko może opierać się o koncepcję RESTa.

Webhaki są już używane przez wiele aplikacji i stron:

  • Pub/Sub (publish/subscribe), reprezentowany przez pubsubhubbub (wbrew pozorom nie jest to zlepek przypadkowych liter!)
  • Git i BitBucket przesyłają informacje o commitach i zmianach w repo
  • WordPress rozsyła informacje (które można sobie skonfigurować wedle woli) kiedy publikujemy posta, komentarz lub stronę
  • Shopify wysyła XMLa z informacją o nowym zamówieniu
  • PayPal używa webhaków, co prawda pod nazwą IPN, do informowania o zamówieniach

Webhaki są na tyle prostym rozwiązaniem, że niektórym trudno docenić potencjał jaki w takim zaczepianiu się stron istnieje. W dużym uproszczeniu, zaadaptowane w aplikacjach pozwalają na wymianę interakcji i danych pomiędzy aplikacjami.