-
Piani Team, Professional, Business ed Enterprise
Mettiti in contatto con il reparto vendite per dubbi relativi alle licenze.
I webhook avvisano servizi esterni come client di chat o altre API esterne in caso di eventi. Un webhook può impostare un URL quando si verifica un evento specifico.
Importante
Il caricamento di file attiva solo gli eventi webhook uploads:create
e uploads:processing
.
keys:creare
, keys:aggiornare
, translations:creare
e translations:aggiornare Gli
eventi webhook non vengono attivati da file uploads o importazioni automatizzate tramite:
C’è un periodo di conservazione di 30 giorni per la cronologia webhook.
Risposta webhook
Un endpoint webhook deve restituire un codice di stato HTTP nell'intervallo 200–299 entro 5 secondi dalla ricezione di una richiamata. Altri codici di stato e timeout di richiesta sono considerati come errori di consegna. Un webhook verrà disattivato se la consegna non riesce per più di 10 eventi consecutivi. Le chiamate non vengono ripetute.
Se ricevi una chiamata, rispondi entro il periodo di timeout della richiesta di 5 secondi. Per garantire che le applicazioni non attivino accidentalmente un timeout, rimanda l'elaborazione a dopo l'invio della risposta HTTP.
Integrità richiesta webhook
Ogni richiesta webhook include un'intestazione X-PhraseApp-Signature
che viene generata utilizzando il token di verifica webhook come chiave privata insieme ai dati inviati nella richiesta. Verificare l'origine della richiesta calcolando il digest HMAC del corpo della richiesta e confrontandolo con il valore nell'intestazione X-PhraseApp-Signature
.
Esempi:
Rubino
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; }
Nome evento |
Descrizione |
---|---|
|
È stato creato un branch. |
|
Un branch è stato unito. |
|
È stato aggiunto un commento su una chiave di traduzione. |
|
Un valore del campo dei metadati personalizzato è stato aggiornato in più chiavi. |
|
Un valore del campo dei metadati personalizzato è stato aggiornato a livello di chiave. |
|
Un lavoro è stato contrassegnato come Completa. |
|
Viene creato un lavoro. |
|
Le impostazioni locali di un lavoro sono state contrassegnate come completate. |
|
Le impostazioni locali di un lavoro sono state riaperte. |
|
Le impostazioni locali di un lavoro sono state revisionate e contrassegnate come Completa. |
|
Le impostazioni locali di un lavoro sono state revisionate e riaperte. |
|
Un lavoro è stato riaperto. |
|
E' iniziato un lavoro. |
|
Un lavoro viene aggiornato. |
|
Le chiavi multiple sono state eliminate. |
|
È stata creata una chiave. |
|
Una chiave è stata eliminata. |
|
Una chiave è stata rinominata o modificata. |
|
È stata creata una nuova versione di lingua in un progetto. |
|
Una versione in lingua è stata eliminata. |
|
Una versione di lingua è stata modificata, rinominata o riconfigurata. |
|
Un progetto è stato modificato o riconfigurato. |
|
È stata creata una versione OTA. |
|
Una versione OTA è stata eliminata. |
|
È stato creato uno screenshot. |
|
Uno screenshot è stato eliminato. |
|
Uno screenshot è stato modificato o rinominato. |
|
È stato eliminato un elenco di traduzioni. |
|
Un elenco di traduzioni è stato revisionato. |
|
Un elenco di traduzioni non è stato revisionato. |
|
Un elenco di traduzioni non verificate. |
|
È stato verificato un elenco di traduzioni. |
|
È stata aggiunta la traduzione di una chiave in una determinata versione lingua. |
|
La traduzione di una chiave in una determinata versione lingua è stata consegnata da un fornitore di servizio lingua. |
|
È stata revisionato una traduzione di una chiave in una determinata versione lingua. |
|
Una traduzione di una chiave in una determinata versione lingua non veniva revisionata. |
|
La traduzione di una chiave in una determinata versione lingua non verificato. |
|
È stata modificata la traduzione di una chiave in una determinata versione lingua. |
|
È stata verificato la traduzione di una chiave in una determinata versione lingua. |
|
Un file impostazioni locali è stato elaborato correttamente. |
|
Un file impostazioni locali è in elaborazione. |
Per aggiungere un webhook, segui i passaggi riportati di seguito:
-
Dalla pagina Configura.
, scorri verso il basso fino ai e fai clic suSi apre la pagina
. -
Fai clic su Aggiungi webhook.
Si apre la finestra
. -
Fornisci dettagli webhook.
-
Facoltativamente,
. -
Fai clic su Salva. Al webhook specificato viene aggiunto l'elenco nella pagina
.
Un webhook può essere disattivato dal menu
di un webhook specifico.Per testare un webhook:
-
Dalla pagina dei Invia notifica di prova dal menu .
, seleziona un webhook e selezionaViene visualizzato un avviso indicante che il test è andato a buon fine.
Usa un servizio come RequestBin per catturare il contenuto di un webhook. RequestBin fornisce un URL che raccoglie i dati di richiesta per l'ispezione.
Una richiesta POST viene inviata all'URL di richiamata specificato ogni volta che si verifica un evento del tipo specificato. Il payload POST della richiesta è un documento codificato JSON con dati rilevanti per l'evento. Gli attributi evento
e messaggio
saranno sempre inclusi, insieme ad attributi aggiuntivi rilevanti per l'evento come l'utente, il progetto e il branch da cui è stato attivato il webhook.
Intestazioni risposta
Le richieste HTTP effettuate all'URL di richiamata conterranno diverse intestazioni speciali.
-
X-PhraseApp-Event
: Il tipo di evento che ha attivato il webhook. -
Firma X-PhraseApp
: il digest esadecimale HMAC del payload, usando la chiave privata dell'hook.
Esempio:
Content-Type: application/json X-PhraseApp-Event: translation:create X-PhraseApp-Signature: abc123 { "event": "translations:create", "message": "Peter translated page.help.title in fr.", "user": { "id": "abcd1234cdef1234abcd1234cdef1234", "username": "joe.doe", "name": "Joe Doe", "email": "joe@phrase.com", "position": "Lead Developer", "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" } }