-
Planos de Equipe, Profissional, Empresarial, Enterprise e Software UI/UX
Entre em contato com Vendas para perguntas sobre licenciamento.
Webhooks notificam serviços externos, como clientes de chat ou outras APIs externas, sobre eventos. Um webhook pode definir uma URL quando um evento específico ocorre.
Importante
Uploads de arquivos apenas acionam os eventos de webhook uploads:create e uploads:processing.
Os eventos de webhook keys:create, keys:update, translations:create e translations:update não são acionados por uploads de arquivos ou importações automatizadas via:
Há um período de retenção de 30 dias para o histórico de webhooks.
Resposta do webhook
Um endpoint de webhook deve retornar um código de status HTTP na faixa de 200–299 dentro de 5 segundos após receber um callback. Outros códigos de status e timeouts de requisição são considerados falhas de entrega. Um webhook será desativado se a entrega falhar por mais de 10 eventos consecutivos. Callbacks não são repetidos.
Se receber um callback, responda dentro do período de timeout de requisição de 5 segundos. Para garantir que as aplicações não acionem acidentalmente um timeout, adie o processamento até que a resposta HTTP tenha sido enviada.
Integridade da solicitação do webhook
Cada solicitação de webhook inclui um cabeçalho X-PhraseApp-Signature que é gerado usando o token de verificação do webhook como um segredo junto com os dados enviados na solicitação. Verifique a origem da solicitação computando o digest HMAC do corpo da solicitação e comparando-o ao valor no cabeçalho X-PhraseApp-Signature.
Exemplos:
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;
}
A estrutura de cada payload de webhook é definida em um arquivo de esquema disponível em https://app.phrase.com/webhook_schemas/<event_underscored_name>.json onde <event_underscored_name> corresponde ao nome do evento do webhook com sublinhados.
branches:create pode ser acessado via https://app.phrase.com/webhook_schemas/branches_create.json
|
Nome do evento |
Descrição |
|---|---|
|
|
Um ramo foi criado. |
|
|
Um ramo foi mesclado. |
|
|
Um comentário sobre uma chave de tradução foi adicionado. |
|
|
Um valor de campo de metadados personalizado foi atualizado em várias chaves. |
|
|
Um valor de campo de metadados personalizado foi atualizado no nível da chave. |
|
|
Um trabalho foi marcado como concluído. |
|
|
Um trabalho é criado. |
|
|
Um local de um trabalho foi marcado como concluído. |
|
|
Um local de um trabalho foi reaberto. |
|
|
Um local de um trabalho foi revisado e marcado como concluído. |
|
|
Um local de um trabalho foi revisado e reaberto. |
|
|
Um trabalho foi reaberto. |
|
|
Um trabalho foi iniciado. |
|
|
Um trabalho é atualizado. |
|
|
Várias chaves foram excluídas. |
|
|
Uma chave foi criada. |
|
|
Uma chave foi excluída. |
|
|
Tags foram adicionadas a várias chaves. |
|
|
Tags foram adicionadas a uma chave. |
|
|
Uma chave foi renomeada ou alterada. |
|
|
Uma nova versão de idioma foi criada em um projeto. |
|
|
Uma versão de idioma foi excluída. |
|
|
Uma versão de idioma foi alterada, renomeada ou reconfigurada. |
|
|
Um projeto foi alterado ou reconfigurado. |
|
|
Uma versão OTA foi criada. |
|
|
Uma versão OTA foi excluída. |
|
|
Uma captura de tela foi criada. |
|
|
Uma captura de tela foi excluída. |
|
|
Uma captura de tela foi alterada ou renomeada. |
|
|
Uma lista de traduções foi excluída. |
|
|
Uma lista de traduções foi incluída. |
|
|
Uma lista de traduções foi revisada. |
|
|
Uma lista de traduções foi não revisada. |
|
|
Uma lista de traduções foi não verificada. |
|
|
Uma lista de traduções foi verificada. |
|
|
Uma tradução de uma chave em uma determinada versão de idioma foi adicionada. |
|
|
Uma tradução de uma chave em uma determinada versão de idioma foi entregue por um prestador de serviços de idioma. |
|
|
Uma tradução de uma chave em uma determinada versão de idioma foi excluída. |
|
|
Uma tradução de uma chave em uma determinada versão de idioma foi incluída. |
|
|
Uma tradução de uma chave em uma determinada versão de idioma foi revisada. |
|
|
Uma tradução de uma chave em uma determinada versão de idioma foi não revisada. |
|
|
Uma tradução de uma chave em uma determinada versão do idioma não foi verificada. |
|
|
Uma tradução de uma chave em uma determinada versão do idioma foi editada. |
|
|
Uma tradução de uma chave em uma determinada versão do idioma foi verificada. |
|
|
Um arquivo de localidade foi processado com sucesso. |
|
|
Um arquivo de localidade está sendo processado. |
Para adicionar um webhook, siga estas etapas:
-
Na página , role para baixo até e clique em Configurar.
A página é aberta.
-
Clique em Adicionar webhook.
A janela é aberta.
-
Forneça os detalhes do webhook.
-
Opcionalmente .
-
Clique em Gravar. O webhook especificado é adicionado à lista na página .
Um webhook pode ser desativado no menu de um webhook específico.
Para testar um webhook:
-
Na página , selecione um webhook e selecione Enviar Notificação de Teste no menu .
Uma notificação é apresentada indicando que o teste foi bem-sucedido.
Use um serviço como RequestBin para capturar o conteúdo de um webhook. RequestBin fornece uma URL que coleta dados de requisição para inspeção.
Uma requisição POST é enviada para a URL de callback especificada cada vez que um evento do tipo especificado ocorre. O payload POST da requisição é um documento codificado em JSON com dados relevantes para o evento. Os atributos event, message e sent_at sempre estarão incluídos, junto com atributos adicionais relevantes para o evento, como o usuário, projeto e ramo de onde o webhook foi acionado.
Cabeçalhos de resposta
As requisições HTTP feitas para a URL de callback conterão vários cabeçalhos especiais.
-
X-PhraseApp-Event: O tipo de evento que acionou o webhook. -
X-PhraseApp-Signature: O digest hex HMAC do payload, usando o segredo do hook como chave.
Exemplo:
Content-Type: application/json
X-PhraseApp-Event: translation:create
X-PhraseApp-Signature: abc123
{
"event": "translations:create",
"message": "Peter traduziu page.help.title em fr.",
"sent_at": "2015-01-29T09:52:53Z"
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "joe.doe",
"name": "Joe Doe",
"email": "joe@phrase.com",
"cargo": "Desenvolvedor Líder",
"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",
"não verificada": false,
"excluída": 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"
}
}