Webhooki
Webhooki (nazywane też wywołaniami zwrotnymi sieciowymi lub interfejsem HTTP push API) umożliwiają przekazywanie informacji i aktualizacji w czasie rzeczywistym. Przesyłają dane do innych aplikacji w chwili wystąpienia zdarzenia, dzięki czemu są znacznie wydajniejszym rozwiązaniem zarówno dla dostawców, jak i odbiorców.
Nasza integracja webhooków zapewnia aktualizacje z tablic monday.com w czasie rzeczywistym. To przydatna alternatywa dla ciągłego odpytywania API o aktualizacje. Możesz subskrybować zdarzenia na swoich tablicach i otrzymywać powiadomienia w postaci żądań HTTP lub HTTPS POST wysyłanych na określony adres URL. Żądanie zawiera dane zdarzenia.
Jeśli tworzysz aplikację do marketplace, zapoznaj się z przewodnikiem po webhookach cyklu życia aplikacji.
Dodawanie webhooka do tablicy
Wykonaj te kroki, aby dodać webhook do jednej ze swoich tablic:
- Otwórz Centrum automatyzacji (Automations Center) w prawym górnym rogu tablicy.
- Kliknij Integracje (Integrations) na dole menu po lewej stronie.
- Wyszukaj webhooki i znajdź naszą aplikację webhooków.
- Wybierz przepis webhooka.
- Podaj adres URL, na który mają być wysyłane dane zdarzenia. Pamiętaj: nasze serwery wyślą na ten adres URL wartość
challenge, aby sprawdzić, czy masz kontrolę nad tym punktem końcowym. Więcej informacji znajdziesz w sekcji weryfikowanie adresu URL webhooka.
Weryfikacja adresu URL
Twoja aplikacja powinna kontrolować podany adres URL. Nasza platforma sprawdza to, wysyłając żądanie POST z treścią JSON zawierającą losowo wygenerowany token w polu challenge. Oczekujemy, że w odpowiedzi na to żądanie zwrócisz token w polu challenge treści JSON.
Wartość challenge będzie wyglądać mniej więcej tak. Treść odpowiedzi powinna być identyczna jak treść żądania POST w formacie JSON.
{
"challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P"
}
Oto prosty przykład nasłuchiwania webhooka. Wypisuje dane webhooka i prawidłowo odpowiada na wartość challenge:
app.post("/", function(req, res) { console.log(JSON.stringify(req.body, 0, 2)); res.status(200).send(req.body);})
from flask import Flask, request, abort, jsonify
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
if request.method == 'POST':
data = request.get_json()
challenge = data['challenge']
return jsonify({'challenge': challenge})
# print(request.json)
# return 'success', 200
else:
abort(400)
if __name__ == '__main__':
app.run(debug=True)
Uwierzytelnianie żądań
Niektóre żądania webhooków zawierają JWT w nagłówku Authorization. Możesz go użyć, aby sprawdzić, czy żądanie jest prawidłowe. Aby uwierzytelnić żądanie, zweryfikuj podpis JWT przy użyciu klucza Signing Secret aplikacji zgodnie z opisem w naszej dokumentacji integracji.
Jeśli chcesz włączyć tę funkcję, utwórz webhook za pomocą tokena aplikacji integracyjnej:
- Utwórz aplikację monday i dodaj do niej funkcję integracji.
- Wygeneruj token OAuth dla tej aplikacji.
- Wywołaj mutację
create_webhookprzy użyciu tokena OAuth.
Wyłączenie możliwości wyłączania webhooka
Użytkownicy końcowi nie mogą wyłączać webhooków integracji. Dzięki temu aplikacja nie przestanie działać, gdy użytkownik końcowy przypadkowo włączy lub wyłączy webhook.
Aby włączyć tę funkcję, utwórz webhook za pomocą tokena aplikacji integracyjnej. Instrukcje znajdziesz w poprzedniej sekcji.
Zasady ponawiania prób
Żądania wysyłane za pośrednictwem naszej integracji webhooków są ponawiane raz na minutę przez 30 minut.
Zapytania
Pobieranie webhooków
-
Wymagany zakres:
webhooks:read -
Zwraca tablicę zawierającą jeden lub więcej webhooków.
-
Można je pobierać tylko bezpośrednio z poziomu głównego zapytania; nie można ich zagnieżdżać w innym zapytaniu.
query {
webhooks(board_id: 1234567890){
id
event
board_id
config
}
}
Argumenty
| Argument | Typ | Opis |
|---|---|---|
| app_webhooks_only | Boolean |
Zwraca tylko webhooki utworzone przez aplikację inicjującą żądanie. |
| board_id | ID! |
Unikalny identyfikator tablicy, której dotyczy subskrypcja webhooka. |
Pola
| Pole | Typ | Opis |
|---|---|---|
| board_id | ID! |
Unikalny identyfikator tablicy webhooka. |
| config | String |
Przechowuje metadane dotyczące działań, które wywołują webhook. |
| event | WebhookEventType! |
Zdarzenie, którego nasłuchuje webhook:
|
| id | ID! |
Unikalny identyfikator webhooka. |
Mutacje
- Wymagany zakres:
webhooks:write
Tworzenie webhooka
Tworzy nowy webhook. Zwraca Webhook.
Po wykonaniu mutacji zostanie utworzona subskrypcja webhooka dla określonego zdarzenia. Webhook będzie wysyłać dane na subskrybowany adres URL za każdym razem, gdy zdarzenie wystąpi na tablicy.
Możesz dodać parametr zapytania do adresu URL webhooka, aby rozróżnić zdarzenia dotyczące podelementów od zdarzeń dotyczących elementów głównych. Adres URL musi przejść test weryfikacyjny. Wyślemy żądanie POST z treścią JSON zawierającą pole challenge. Oczekujemy, że podany adres URL zwróci token w polu challenge treści odpowiedzi JSON na to żądanie.
mutation {
create_webhook (board_id: 1234567890, url: "https://www.webhooks.my-webhook/test/", event: change_status_column_value, config: "{\"columnId\":\"status\", \"columnValue\":{\"$any$\":true}}") {
id
board_id
}
}
Argumenty
| Argument | Typ | Definicja |
|---|---|---|
| board_id | ID! |
Unikalny identyfikator tablicy. Jeśli tworzysz webhook dla zdarzeń dotyczących podelementów, podaj identyfikator tablicy głównej (nadrzędnej). |
| config | JSON |
Konfiguracja webhooka. |
| event | WebhookEventType! |
Zdarzenie, którego ma nasłuchiwać webhook:
|
| url | String! |
Adres URL webhooka. Ten argument może mieć maksymalnie 255 znaków. |
Uwaga: niektóre zdarzenia obsługują też argument config, który służy do przekazywania konfiguracji zdarzenia.
Zdarzenia obsługujące argument config |
JSON | Uwagi |
|---|---|---|
change_specific_column_value |
{"columnId": "column_id"} | Ta mutacja nie obsługuje obecnie subskrybowania kolumn podelementów. Informacje o tym, jak znaleźć identyfikator kolumny, znajdziesz tutaj. |
change_status_column_value |
{"columnValue": {"index": please see note*}, "columnId": "column_id"}, | Informacje o tym, jak znaleźć indeks i identyfikator kolumny, znajdziesz tutaj. **Struktura wartości |
item_moved_to_specific_group |
{"groupId": "group_id"} | Informacje o tym, jak znaleźć identyfikator grupy, znajdziesz tutaj. |
Usuwanie webhooka
Usuwa webhook, aby zdarzenia nie były już wysyłane na podany adres URL. Zwraca Webhook.
mutation {
delete_webhook (id: 12) {
id
board_id
}
}
Argumenty
| Argument | Typ | Definicja |
|---|---|---|
| id | ID! |
Unikalny identyfikator webhooka. |
Przykładowe dane dla zdarzeń webhooka
Każdy webhook wysłany do Twojego punktu końcowego będzie zawierać pole event z danymi zdarzenia. Webhooki podelementów będą zawierać podobne dane dla każdego zdarzenia, a także pola parent_item_id i identyfikator tablicy podelementu. Szczegółowe przykłady danych znajdziesz poniżej.
"event": {
"userId": 9603417,
"originalTriggerUuid": null,
"boardId": 1771812698,
"pulseId": 1772099344,
"pulseName": "Create_item webhook",
"groupId": "topics",
"groupName": "Group Title",
"groupColor": "#579bfc",
"isTopGroup": true,
"columnValues": {},
"app": "monday",
"type": "create_pulse",
"triggerTime": "2021-10-11T09:07:28.210Z",
"subscriptionId": 73759690,
"triggerUuid": "b5ed2e17c530f43668de130142445cba"
}
"event": {
"userId": 9603417,
"originalTriggerUuid": null,
"boardId": 1772135370,
"pulseId": 1772139123,
"itemId": 1772139123,
"pulseName": "sub-item",
"groupId": "topics",
"groupName": "Subitems",
"groupColor": "#579bfc",
"isTopGroup": true,
"columnValues": {},
"app": "monday",
"type": "create_pulse",
"triggerTime": "2021-10-11T09:24:51.835Z",
"subscriptionId": 73761697,
"triggerUuid": "5c28578c66653a87b00a80aa4f7a6ce3",
"parentItemId": "1771812716",
"parentItemBoardId": "1771812698"
}
"event": {
"userId": 9603417,
"originalTriggerUuid": null,
"boardId": 1771812698,
"groupId": "topics",
"pulseId": 1771812728,
"pulseName": "Crate_item webhook",
"columnId": "date4",
"columnType": "date",
"columnTitle": "Date",
"value": {
"date": "2021-10-11",
"icon": null,
"time": null
},
"previousValue": null,
"changedAt": 1633943701.9457765,
"isTopGroup": true,
"app": "monday",
"type": "update_column_value",
"triggerTime": "2021-10-11T09:15:03.429Z",
"subscriptionId": 73760484,
"triggerUuid": "645fc8d8709d35718f1ae00ceded91e9"
}
"event": {
"userId": 9603417,
"originalTriggerUuid": null,
"boardId": 1771812698,
"pulseId": 1771812728,
"body": "<p>create_update webhook</p>",
"textBody": "create_update webhook",
"updateId": 1190616585,
"replyId": null,
"app": "monday",
"type": "create_update",
"triggerTime": "2021-10-11T09:18:57.368Z",
"subscriptionId": 73760983,
"triggerUuid": "6119292e27abcc571f90ea4177e94973"
}
"event": {
"userId": 9603417,
"originalTriggerUuid": null,
"boardId": 1771812698,
"groupId": "topics",
"pulseId": 1772099344,
"pulseName": "Create_item webhook",
"columnId": "status",
"columnType": "color",
"columnTitle": "Status",
"value": {
"label": {
"index": 3,
"text": "Status change wbhook",
"style": {
"color": "#0086c0",
"border": "#3DB0DF",
"var_name": "blue-links"
}
},
"post_id": null
},
"previousValue": null,
"changedAt": 1633944017.473193,
"isTopGroup": true,
"app": "monday",
"type": "update_column_value",
"triggerTime": "2021-10-11T09:20:18.022Z",
"subscriptionId": 73761176,
"triggerUuid": "504b2eb76c80f672a18f892c0f700e41"
}
