
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:
- Serwer publikujący hak informujemy o URLu, na który ma wysłać powiadomienie (zwykle POSTem).
- Kiedy serwer ma coś do powiedzenia wysyła na wskazany URL dane.
- 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.

