-
Piani Team, Professional, Business, Enterprise e Software UI/UX
Mettiti in contatto con il reparto vendite per dubbi relativi alle licenze.
Le notifiche webhook avvisano servizi esterni come client di chat o altre API esterne degli 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.
Gli eventi webhook keys:create, keys:update, translations:create e translations:update non vengono attivati da caricamenti di file o importazioni automatizzate mediante:
È previsto un periodo di conservazione di 30 giorni per la cronologia dei webhook.
Risposta webhook
Un endpoint webhook deve restituire un codice di stato HTTP nell'intervallo 200–299 entro 5 secondi dalla ricezione di un callback. Altri codici di stato e timeout delle richieste sono considerati errori di consegna. Un webhook verrà disattivato se la consegna fallisce per più di 10 eventi consecutivi. I callback non vengono ripetuti.
Se ricevi un callback, rispondi entro il periodo di timeout della richiesta di 5 secondi. Per assicurarti che le applicazioni non attivino accidentalmente un timeout, posticipa l'elaborazione a dopo l'invio della risposta HTTP.
Integrità della richiesta webhook
Ogni richiesta webhook include un'intestazione X-PhraseApp-Signature che viene generata utilizzando il token di verifica del webhook come segreto insieme ai dati inviati nella richiesta. Verifica l'origine della richiesta calcolando il digest HMAC del corpo della richiesta e confrontandolo con il valore nell'intestazione X-PhraseApp-Signature.
Esempi:
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;
}
La struttura di ogni payload del webhook è definita in un file di schema disponibile all'indirizzo https://app.phrase.com/webhook_schemas/<event_underscored_name>.json, dove <event_underscored_name> corrisponde al nome dell'evento webhook con underscore.
branches:create è accessibile tramite https://app.phrase.com/webhook_schemas/branches_create.json
|
Nome evento |
Descrizione |
|---|---|
|
|
È stato creato un branch. |
|
|
È stato unito un branch. |
|
|
È stato aggiunto un commento a una chiave di traduzione. |
|
|
Un valore di campo di metadati personalizzato è stato aggiornato in più chiavi. |
|
|
Un valore di campo di metadati personalizzato è stato aggiornato a livello di chiave. |
|
|
Un lavoro è stato contrassegnato come completato. |
|
|
Un lavoro viene creato. |
|
|
Una versione linguistica di un lavoro è stata contrassegnata come completata. |
|
|
Una versione linguistica di un lavoro è stata riaperta. |
|
|
Una versione linguistica di un lavoro è stata revisionata e contrassegnata come completata. |
|
|
Una versione linguistica di un lavoro è stata revisionata e riaperta. |
|
|
Un lavoro è stato riaperto. |
|
|
Un lavoro è stato avviato. |
|
|
Un lavoro viene aggiornato. |
|
|
Una chiave subordinata è collegata a una chiave principale. |
|
|
Una chiave subordinata è stata scollegata da una chiave principale. |
|
|
Più chiavi sono state eliminate. |
|
|
È stata creata una chiave. |
|
|
Una chiave è stata eliminata. |
|
|
Sono stati aggiunti tag a più chiavi. |
|
|
Sono stati aggiunti tag a una chiave. |
|
|
Una chiave è stata rinominata o modificata. |
|
|
È stata creata una nuova versione linguistica in un progetto. |
|
|
Una versione linguistica è stata eliminata. |
|
|
Una versione linguistica è stata modificata, rinominata o riconfigurata. |
|
|
Un progetto è stato modificato o riconfigurato. |
|
|
È stata creata una release OTA. |
|
|
Una release OTA è stata eliminata. |
|
|
È stato creato uno screenshot. |
|
|
Uno screenshot è stato eliminato. |
|
|
Uno screenshot è stato modificato o rinominato. |
|
|
Un elenco di traduzioni è stato eliminato. |
|
|
È stato incluso un elenco di traduzioni. |
|
|
È stato revisionato un elenco di traduzioni. |
|
|
È stato non revisionato un elenco di traduzioni. |
|
|
È stato non verificato un elenco di traduzioni. |
|
|
È stato verificato un elenco di traduzioni. |
|
|
È stata aggiunta una traduzione di una chiave in una determinata versione linguistica. |
|
|
Una traduzione di una chiave in una determinata versione linguistica è stata consegnata da un fornitore di servizi linguistici. |
|
|
È stata esclusa una traduzione di una chiave in una determinata versione linguistica. |
|
|
È stata inclusa una traduzione di una chiave in una determinata versione linguistica. |
|
|
È stata revisionata una traduzione di una chiave in una determinata versione linguistica. |
|
|
Una traduzione di una chiave in una determinata versione linguistica non è stata revisionata. |
|
|
È stata non verificata una traduzione di una chiave in una determinata versione linguistica. |
|
|
È stata modificata una traduzione di una chiave in una determinata versione linguistica. |
|
|
È stata verificata una traduzione di una chiave in una determinata versione linguistica. |
|
|
Un file delle impostazioni locali è stato elaborato correttamente. |
|
|
Un file delle impostazioni locali è in fase di elaborazione. |
Per aggiungere un webhook, segui questi passaggi:
-
Dalla pagina , scorri verso il basso fino a e fai clic su Configura.
Si apre la pagina .
-
Fai clic su Aggiungi webhook.
Si apre la finestra .
-
Fornisci i dettagli del webhook.
-
Facoltativamente .
-
Fai clic su Salva. Il webhook specificato viene aggiunto all'elenco nella pagina .
Un webhook può essere disattivato dal menu di uno specifico webhook.
Per testare un webhook:
-
Dalla pagina , seleziona un webhook e seleziona Invia notifica di test dal menu .
Viene visualizzato un avviso che indica che il test è riuscito.
Utilizza un servizio come RequestBin per acquisire i contenuti di un webhook. RequestBin fornisce un URL che raccoglie i dati della richiesta per l'ispezione.
Una richiesta POST viene inviata all'URL di callback specificato ogni volta che si verifica un evento del tipo specificato. Il payload POST della richiesta è un documento codificato in JSON con i dati rilevanti per l'evento. Gli attributi event, message e sent_at saranno sempre inclusi, insieme ad attributi aggiuntivi rilevanti per l'evento come user, project e branch da cui è stato attivato il webhook.
Intestazioni di response
Le richieste HTTP effettuate all'URL di callback conterranno diverse intestazioni speciali.
-
X-PhraseApp-Event: Il tipo di evento che ha attivato il webhook. -
X-PhraseApp-Signature: Il digest esadecimale HMAC del payload, calcolato utilizzando il segreto dell'hook come chiave.
Esempio:
Content-Type: application/json
X-PhraseApp-Event: translation:create
X-PhraseApp-Signature: abc123
{
"event": "translations:create",
"message": "Peter ha tradotto page.help.title in fr.",
"sent_at": "2015-01-29T09:52:53Z"
"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"
}
}