-
Team-, Business-, Enterprise-, Professional- und Software-UI/UX-Pläne
Kontaktiere Vertrieb für Fragen zur Lizenzierung.
Webhooks benachrichtigen externe Dienste wie Chat-Clients oder andere externe APIs über Ereignisse. Ein Webhook kann eine URL festlegen, wenn ein bestimmtes Ereignis eintritt.
Wichtig
Datei-Uploads lösen nur die Webhook-Ereignisse uploads:create und uploads:processing aus.
Die Webhook-Ereignisse keys:create, keys:update, translations:create und translations:update werden nicht durch Datei-Uploads oder automatisierte Importe über Folgendes ausgelöst:
Es gibt eine Aufbewahrungsfrist von 30 Tagen für den Webhook-Verlauf.
Webhook-Antwort
Ein Webhook-Endpunkt muss innerhalb von 5 Sekunden nach Erhalt eines Callbacks einen HTTP-Statuscode im Bereich 200–299 zurückgeben. Andere Statuscodes und Zeitüberschreitungen bei Anfragen gelten als Zustellungsfehler. Ein Webhook wird deaktiviert, wenn die Zustellung für mehr als 10 aufeinanderfolgende Ereignisse fehlschlägt. Callbacks werden nicht wiederholt.
Wird ein Callback empfangen, muss innerhalb des 5-Sekunden-Anfragezeitlimits geantwortet werden. Um zu vermeiden, dass Anwendungen versehentlich eine Zeitüberschreitung auslösen, sollte die Verarbeitung erst nach dem Versand der HTTP-Antwort erfolgen.
Integrität von Webhook-Anfragen
Jede Webhook-Anfrage enthält einen X-PhraseApp-Signature-Header, der unter Verwendung des Webhook-Verifizierungstokens als Geheimnis zusammen mit den in der Anfrage gesendeten Daten generiert wird. Der Ursprung der Anfrage wird überprüft, indem der HMAC-Digest des Anfragekörpers berechnet und mit dem Wert im X-PhraseApp-Signature-Header verglichen wird.
Beispiele:
Ruby
def verify_webhook(signatureheader)
digest = OpenSSL::Digest::Digest.new('sha256')
hmac = OpenSSL::HMAC.digest(digest, VERIFICATION_TOKEN, request.body)
hmac = Base64.encode64(hmac).strip
hmac == signatureheader
end
<?PHP
function verify_webhook($signatureheader){
$hmac = hash_hmac('sha256', $requestBody, $verificationToken, true);
$hmac = trim(base64_encode($hash));
return $hmac == $signatureheader;
}
Die Struktur jedes Webhook-Payloads ist in einer Schemadatei definiert, die unter https://app.phrase.com/webhook_schemas/<event_underscored_name>.json verfügbar ist, wobei <event_underscored_name> dem Namen des Webhook-Ereignisses mit Unterstrichen entspricht.
Auf https://app.phrase.com/webhook_schemas/branches_create.json kann auf branches:create zugegriffen werden.
|
Ereignisname |
Beschreibung |
|---|---|
|
|
Ein Branch wurde erstellt. |
|
|
Ein Branch wurde zusammengeführt. |
|
|
Ein Kommentar zu einem Übersetzungsschlüssel wurde hinzugefügt. |
|
|
Ein Wert eines benutzerdefinierten Metadatenfelds wurde in mehreren Schlüsseln aktualisiert. |
|
|
Ein Wert eines benutzerdefinierten Metadatenfelds wurde auf Schlüsselebene aktualisiert. |
|
|
Ein Job wurde als abgeschlossen markiert. |
|
|
Ein Job wird erstellt. |
|
|
Eine Lokalisierung eines Jobs wurde als abgeschlossen markiert. |
|
|
Eine Lokalisierung eines Jobs wurde wieder geöffnet. |
|
|
Eine Lokalisierung eines Jobs wurde überprüft und als abgeschlossen markiert. |
|
|
Eine Lokalisierung eines Jobs wurde überprüft und wieder geöffnet. |
|
|
Ein Job wurde wieder geöffnet. |
|
|
Ein Job wurde gestartet. |
|
|
Ein Job wird aktualisiert. |
|
|
Ein untergeordneter Schlüssel ist mit einem übergeordneten Schlüssel verknüpft. |
|
|
Ein untergeordneter Schlüssel wird von einem übergeordneten Schlüssel getrennt. |
|
|
Mehrere Schlüssel wurden gelöscht. |
|
|
Ein Schlüssel wurde erstellt. |
|
|
Ein Schlüssel wurde gelöscht. |
|
|
Tags wurden zu mehreren Schlüsseln hinzugefügt. |
|
|
Tags wurden zu einem Schlüssel hinzugefügt. |
|
|
Ein Schlüssel wurde umbenannt oder geändert. |
|
|
Eine neue Sprachversion wurde in einem Projekt erstellt. |
|
|
Eine Sprachversion wurde gelöscht. |
|
|
Eine Sprachversion wurde geändert, umbenannt oder neu konfiguriert. |
|
|
Ein Projekt wurde geändert oder neu konfiguriert. |
|
|
Ein OTA-Release wurde erstellt. |
|
|
Ein OTA-Release wurde gelöscht. |
|
|
Ein Screenshot wurde erstellt. |
|
|
Ein Screenshot wurde gelöscht. |
|
|
Ein Screenshot wurde geändert oder umbenannt. |
|
|
Eine Liste von Übersetzungen wurde gelöscht. |
|
|
Eine Liste von Übersetzungen wurde einbezogen. |
|
|
Eine Liste von Übersetzungen wurde überprüft. |
|
|
Eine Liste von Übersetzungen wurde nicht überprüft. |
|
|
Eine Liste von Übersetzungen wurde nicht verifiziert. |
|
|
Eine Liste von Übersetzungen wurde verifiziert. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde hinzugefügt. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde von einem Sprachdienstleister geliefert. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde ausgeschlossen. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde einbezogen. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde überprüft. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde nicht überprüft. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde nicht verifiziert. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde bearbeitet. |
|
|
Eine Übersetzung eines Schlüssels in einer bestimmten Sprachversion wurde verifiziert. |
|
|
Eine Lokalisierungsdatei wurde erfolgreich verarbeitet. |
|
|
Eine Lokalisierungsdatei wird verarbeitet. |
Zum Hinzufügen eines Webhooks sind die folgenden Schritte auszuführen:
-
Auf der Seite nach unten scrollen, bis sichtbar sind, und anschließend Configure auswählen.
Die Seite wird geöffnet.
-
Add webhook auswählen.
Das Fenster wird geöffnet.
-
Webhook-Details angeben.
-
Optional kann ausgewählt werden.
-
Klicke auf Speichern. Der angegebene Webhook wird der Liste auf der Seite hinzugefügt.
Ein Webhook kann über das Menü eines bestimmten Webhooks deaktiviert werden.
Zum Testen eines Webhooks:
-
Auf der Seite einen Webhook auswählen und anschließend im Menü Send Test-Notification auswählen.
Es wird ein Hinweis angezeigt, der angibt, dass der Test erfolgreich war.
Zum Erfassen des Inhalts eines Webhooks kann ein Dienst wie RequestBin genutzt werden. RequestBin stellt eine URL bereit, die Anfragedaten zur Überprüfung sammelt.
Jedes Mal, wenn ein Ereignis des angegebenen Typs eintritt, wird eine POST-Anfrage an die angegebene Callback-URL gesendet. Das POST-Payload der Anfrage ist ein JSON-kodiertes Dokument mit relevanten Daten für das Ereignis. Die Attribute event, message und sent_at werden immer enthalten sein, zusammen mit zusätzlichen für das Ereignis relevanten Attributen wie user, project und branch, von dem aus der Webhook ausgelöst wurde.
Antwort-Header
HTTP-Anfragen an die Callback-URL enthalten mehrere spezielle Header.
-
X-PhraseApp-Event Die Art des Ereignisses, das den Webhook ausgelöst hat.
-
X-PhraseApp-Signature Der HMAC-Hex-Digest der Nutzlast unter Verwendung des Hooks-Geheimnisses als Schlüssel.
Beispiel:
Content-Type: application/json
X-PhraseApp-Event: translation:create
X-PhraseApp-Signature: abc123
{
"event": "translations:create",
"message": "Peter hat page.help.title auf fr. übersetzt.",
"gesendet_am": "2015-01-29T09:52:53Z"
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "joe.doe",
"name": "Joe Doe",
"email": "joe@phrase.com",
Position "Leitender Entwickler",
"created_at": "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
},
"project": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"name": "My Android Project",
"main_format": "xml",
"project_image_url": "http://assets.phrase.com/project.png",
"account": "account",
"created_at": "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
},
"branch": {
"name": "branch_name"
},
"translation": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"content": "My translation",
"unverified": false,
"excluded": false,
"plural_suffix": "",
"key": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"name": "home.index.headline",
"plural": false
},
"locale": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"name": "de",
"code": "de-DE"
},
"placeholders": [
"%{count}"
],
"created_at": "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
}
}