-
Planos Team, Professional, Business e Enterprise
Entre em contato com Comércio para perguntas de licenciamento.
Os webhooks notificam serviços externos, como clientes de bate-papo ou outras APIs externas de eventos. Um webhook pode definir uma URL quando um evento específico ocorre.
Importante
Uploads de arquivo acionam apenas os uploads:criar
e uploads:processando
eventos webhook.
chave:criar
, chave:atualizar
, traduções:criar
e traduções:atualizar
os eventos webhook não são acionados por uploads de arquivos ou importações automatizadas por meio de:
Há um período de retenção de 30 dias para o histórico de webhook.
Resposta webhook
Um endpoint webhook deve retornar um código de estado HTTP na escala de 200–299 no prazo de 5 segundos após receber uma chamada de retorno. Outros códigos de estado e tempo limite de solicitação são considerados erros de entrega. Um webhook será desativado se o envio falhar por mais de 10 eventos consecutivos. As chamadas de retorno não são repetidas.
Se receber uma chamada de retorno, responda dentro do tempo limite de 5 segundos para solicitação. Para garantir que os aplicativos não acionem acidentalmente um tempo limite, adiar o processamento até após o envio da resposta HTTP.
Integridade de solicitação webhook
Cada solicitação de webhook inclui um cabeçalho de X-PhraseApp-Signature
que é gerado usando o token de verificação de webhook como um segredo, bem como os dados enviados na solicitação. Verifique a origem da solicitação calculando o sumário HMAC do corpo da solicitação e comparando-o com o valor no cabeçalho X-PhraseApp-Signature
.
Exemplos:
Rubio
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 do evento |
Descrição |
---|---|
|
Um ramo foi criado. |
|
Um ramo foi mesclado. |
|
Um comentar em 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 ao nível da chave. |
|
Um trabalho foi marcado como Concluir. |
|
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 Concluir. |
|
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. |
|
Uma chave foi renomeada ou alterada. |
|
Uma nova versão do 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. |
|
Um lançamento OTA foi criado. |
|
Um lançamento OTA foi excluído. |
|
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 revisada. |
|
Uma lista de traduções não foi revisada. |
|
Uma lista de traduções foi não verificada. |
|
Uma lista de traduções foi verificada. |
|
Foi adicionada uma tradução de uma chave em uma versão de idioma específica. |
|
Uma tradução de uma chave em uma versão de idioma específica foi fornecida por um responsável de serviços de idioma. |
|
Foi revisada uma tradução de uma chave em uma versão de idioma específica. |
|
Uma tradução de uma chave em uma versão de idioma específica não foi revisada. |
|
Uma tradução de uma chave em uma versão de idioma específica foi não verificada. |
|
Foi editada uma tradução de uma chave em uma versão de idioma específica. |
|
Foi verificada uma tradução de uma chave em uma versão de idioma específica. |
|
Um arquivo local foi processado. |
|
Um arquivo local está sendo processado. |
Para adicionar um webhook, siga estes passos:
-
Na página de configurar.
role para baixo até e clique emA página
é aberta. -
Clique em Adicionar webhook.
A janela
é aberta. -
Forneça detalhes do webhook.
-
Opcionalmente,
. -
Clique em Gravar. O webhook especificado está adicionado à lista na página
.
Um webhook pode ser desativado no menu
de um webhook específico.Para testar um webhook:
-
Na página enviar notificação de teste do menu .
, selecione um webhook e selecioneUm aviso é apresentado indicando que o teste foi bem-sucedido.
Use um serviço como RequestBin para capturar o conteúdo de um webhook. O RequestBin fornece um URL que coleta dados de solicitação para inspecção.
Uma solicitação POST é enviada ao URL de retorno especificado sempre que ocorre um evento do tipo especificado. A carga útil POST da solicitação é um documento codificado JSON com dados relevantes para o evento. Os atributos evento
e mensaxe
sempre serão incluídos, juntamente com atributos adicionais relevantes para o evento, como o usuário, projeto e ramo do webhook foi acionado.
Cabeçalhos de repetição
As solicitações HTTP feitas para o URL de retorno contêm vários cabeçalhos especiais.
-
X-PhraseApp-Event
: O tipo de evento que acionou o webhook. -
X-PhraseApp-Signature
: O hexagrupo HMAC da carga útil, usando o segredo do gancho como a chave.
Exemplo:
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", "nome": "Joe Doe", "email": "joe@phrase.com", "position": "Desenvolvedor Líder", "created_at": "2015-01-28T09:52:53Z", "updated_at": "2015-01-28T09:52:53Z" }, "project": { "id": "abcd1234cdef1234abcd1234cdef1234", "nome": "Meu projeto 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": "Minha tradução", "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" } }