Intégrations

Webhooks (Chaînes)

Le contenu est traduit de l’anglais par Phrase Language AI.

Disponible pour

  • Équipe, Professionnel, Business, Entreprise et plans UI/UX logiciels

Contactez le service commercial pour toute question relative aux licences.

Les webhooks notifient des services externes tels que des clients de chat ou d'autres API externes d'événements. Un webhook peut définir une URL lorsqu'un événement spécifique se produit.

Important

Les téléchargements de fichiers déclenchent uniquement les événements de webhook uploads:create et uploads:processing.

Les événements de webhook keys:create, keys:update, translations:create et translations:update ne sont pas déclenchés par des téléchargements de fichiers ou des imports automatisés via :

Il y a une période de conservation de 30 jours pour l'historique des webhooks.

Réponse du webhook

Un point de terminaison de webhook doit renvoyer un code de statut HTTP dans la plage 200–299 dans les 5 secondes suivant la réception d'un rappel. D'autres codes de statut et les délais d'attente des requêtes sont considérés comme des échecs de livraison. Un webhook sera désactivé si la livraison échoue pendant plus de 10 événements consécutifs. Les rappels ne sont pas répétés.

Si vous recevez un rappel, répondez dans la période de délai d'attente de 5 secondes. Pour garantir que les applications ne déclenchent pas accidentellement un délai d'attente, différer le traitement jusqu'après l'envoi de la réponse HTTP.

Intégrité de la requête Webhook

Chaque requête webhook inclut un en-tête X-PhraseApp-Signature qui est généré en utilisant le jeton de vérification webhook comme secret, ainsi que les données envoyées dans la requête. Vérifiez l'origine de la requête en calculant le hachage HMAC du corps de la requête et en le comparant à la valeur dans l'en-tête X-PhraseApp-Signature.

Exemples :

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;
}

Événements Webhook

La structure de chaque charge utile webhook est définie dans un fichier de schéma disponible à https://app.phrase.com/webhook_schemas/<event_underscored_name>.json où <event_underscored_name> correspond au nom de l'événement webhook avec des underscores.

branches:create peut être accessible via https://app.phrase.com/webhook_schemas/branches_create.json

Nom de l'événement

Description

branches:create

Une branche a été créée.

branches:merge

Une branche a été fusionnée.

comments:create

Un commentaire sur une clé de traduction a été ajouté.

custom_metadata_values:batch_update

La valeur d'un champ de métadonnées personnalisé a été mise à jour dans plusieurs clés.

custom_metadata_values:update

La valeur d'un champ de métadonnées personnalisé a été mise à jour au niveau de la clé.

jobs:complete

Une tâche a été marquée comme terminée.

jobs:create

Une tâche est créée.

jobs:locale:complete

Le paramètre linguistique d'une tâche a été marqué comme terminé.

jobs:locale:reopened

Le paramètre linguistique d'une tâche a été rouvert.

jobs:locale:review:complete

Le paramètre linguistique d'une tâche a été révisé et marqué comme terminé.

jobs:locale:review:reopen

Le paramètre linguistique d'une tâche a été révisé et rouvert.

jobs:reopened

Un travail a été rouvert.

jobs:start

Un travail a été commencé.

jobs:update

Un travail est mis à jour.

keys:batch_delete

Plusieurs clés ont été supprimées.

keys:create

Une clé a été créée.

keys:delete

Une clé a été supprimée.

keys:tags:batch_create

Des étiquettes ont été ajoutées à plusieurs clés.

keys:tags:create

Des étiquettes ont été ajoutées à une clé.

keys:update

Une clé a été renommée ou modifiée.

locales:create

Une nouvelle version linguistique a été créée dans un projet.

locales:delete

Une version linguistique a été supprimée.

locales:update

Une version de la langue a été changée, renommée ou reconfigurée.

project:update

Un projet a été changé ou reconfiguré.

releases:créer

Une version OTA a été créée.

releases:delete

Une version OTA a été supprimée.

captures d'écran:créer

Une capture d'écran a été créée.

screenshots:delete

Une capture d'écran a été supprimée.

captures d'écran:mettre à jour

Une capture d'écran a été changée ou renommée.

translations:batch_delete

Une liste de traductions a été supprimée.

translations:batch_include

Une liste de traductions a été incluse.

translations:batch_review

Une liste de traductions a été révisée.

translations:batch_unreview

Une liste de traductions a été non révisée.

translations:batch_unverify

Une liste de traductions n'a pas été vérifiée.

translations:batch_verify

Une liste de traductions a été vérifiée.

translations:create

Une traduction d'une clé dans une certaine version linguistique a été ajoutée.

translations:deliver

Une traduction d'une clé dans une certaine version linguistique a été livrée par un fournisseur de services linguistiques.

translations:exclude

Une traduction d'une clé dans une certaine version linguistique a été exclue.

translations:include

Une traduction d'une clé dans une certaine version linguistique a été incluse.

translations:review

Une traduction d'une clé dans une certaine version linguistique a été révisée.

translations:unreview

Une traduction d'une clé dans une certaine version linguistique n'a pas été révisée.

translations:unverify

Une traduction d'une clé dans une certaine version linguistique n'a pas été vérifiée.

translations:update

Une traduction d'une clé dans une certaine version linguistique a été modifiée.

translations:verify

Une traduction d'une clé dans une certaine version linguistique a été vérifiée.

uploads:create

Un fichier de paramètre linguistique a été traité avec succès.

uploads:processing

Un fichier de paramètre linguistique est en cours de traitement.

Ajouter un Webhook

Pour ajouter un webhook, procédez comme suit :

  1. Depuis la page Intégrations, faites défiler vers le bas jusqu'à Webhooks et cliquez sur Configurer.

    La page Webhooks s'ouvre.

  2. Cliquez sur Ajouter un webhook.

    La fenêtre Ajouter un webhook s'ouvre.

  3. Fournissez les détails du webhook.

  4. Optionnellement Inclure des branches.

  5. Cliquez sur Enregistrer. Le webhook spécifié est ajouté à la liste sur la page Webhooks.

Un webhook peut être désactivé depuis le menu Plus d'un webhook spécifique.

Tester un Webhook

Pour tester un webhook :

  • Depuis la page Webhooks, sélectionnez un webhook et sélectionnez Envoyer une notification de test dans le menu Plus.

    Un avis s'affiche indiquant que le test a réussi.

Utilisez un service tel que RequestBin pour capturer le contenu d'un webhook. RequestBin fournit une URL qui collecte les données de requête pour inspection.

Utilisation des données de webhook

Une requête POST est envoyée à l'URL de rappel spécifiée chaque fois qu'un événement du type spécifié se produit. Le payload POST de la requête est un document encodé en JSON contenant des données pertinentes pour l'événement. Les attributs event, message et sent_at seront toujours inclus, ainsi que des attributs supplémentaires pertinents pour l'événement tels que le user, project et branch à partir desquels le webhook a été déclenché.

En-têtes de réponse

Les requêtes HTTP envoyées à l'URL de rappel contiendront plusieurs en-têtes spéciaux.

  • X-PhraseApp-Event: Le type d'événement qui a déclenché le webhook.

  • X-PhraseApp-Signature: Le hachage hexadécimal HMAC du payload, utilisant le secret du hook comme clé.

Exemple :

Content-Type: application/json
X-PhraseApp-Event: translation:create
X-PhraseApp-Signature: abc123

{
  "event": "translations:create",
  "message": "Peter translated 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": "Mon projet Android",
    "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": "Ma traduction",
    "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"
  }
}
Cet article vous a-t-il été utile ?

Sorry about that! In what way was it not helpful?

The article didn’t address my problem.
I couldn’t understand the article.
The feature doesn’t do what I need.
Other reason.

Note that feedback is provided anonymously so we aren't able to reply to questions.
If you'd like to ask a question, submit a request to our Support team.
Thank you for your feedback.