-
Планы Team, Professional, Business, Enterprise и Software UI/UX
Свяжитесь с отделом продаж по вопросам лицензирования.
Вебхуки уведомляют внешние службы, такие как чат-клиенты или другие внешние API, о событиях. Вебхук может задать URL-адрес, когда происходит определенное событие.
Важно
Загрузка файлов запускает только события вебхука uploads:create и uploads:processing.
События вебхука keys:create, keys:update, translations:create и translations:update не запускаются при загрузке файлов или автоматизированном импорте через:
Для истории вебхуков установлен 30-дневный срок хранения.
Ответ вебхука
Конечная точка вебхука должна возвращать HTTP статус в диапазоне 200–299 в течение 5 секунд после получения обратного вызова. Другие коды статус и тайм-ауты запросов считаются сбоями доставки. Вебхук будет деактивирован, если доставка не удалась для более чем 10 событий подряд. Обратные вызовы не повторяются.
При получении обратного вызова ответьте в течение 5-секундного периода ожидания запроса. Чтобы приложения случайно не вызвали тайм-аут, отложите обработку до момента отправки HTTP-ответа.
Целостность запроса вебхука
Каждый запрос вебхука включает заголовок X-PhraseApp-Signature, который генерируется с использованием токена подтверждения вебхука в качестве секрета вместе с данными, отправленными в запросе. Подтвердить источник запроса путем вычисления HMAC-дайджеста тела запроса и сравнения его со значением в заголовке X-PhraseApp-Signature.
Примеры:
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;
}
Структура полезной нагрузки каждого вебхук определяется в файле схемы, доступном по адресу https://app.phrase.com/webhook_schemas/<event_underscored_name>.json, где <event_underscored_name> соответствует имени события вебхук с подчеркиваниями.
branches:создать можно получить через https://app.phrase.com/webhook_schemas/branches_create.json
|
Имя события |
Описание |
|---|---|
|
|
Ветвь была создана. |
|
|
Ветвь была объединена. |
|
|
Был добавлен комментировать к ключ перевода. |
|
|
Пользовательский значение поля метаданных было обновлено в нескольких ключах. |
|
|
Пользовательский значение поля метаданных было обновлено на уровне ключ. |
|
|
Задание было помечено как Завершить. |
|
|
Задание было создать. |
|
|
Языковой стандарт задания был помечен как завершенный. |
|
|
Языковой стандарт задания был повторно открыт. |
|
|
Языковой стандарт задания был проверено и помечен как Завершить. |
|
|
Языковой стандарт задания был проверено и повторно открыт. |
|
|
Задание было повторно открыто. |
|
|
Задание было запущено. |
|
|
Задание было обновлено. |
|
|
Несколько ключей было удалено. |
|
|
Ключ был создан. |
|
|
Ключ был удален. |
|
|
Теги были добавлены к нескольким ключам. |
|
|
Теги были добавлены к ключу. |
|
|
Ключ был переименован или изменен. |
|
|
Новая версия языка была создана в проекте. |
|
|
Версия языка была удалена. |
|
|
Версия языка была изменена, переименована или перенастроена. |
|
|
Проект был изменен или перенастроен. |
|
|
Было создано обновление по воздуху (OTA). |
|
|
Обновление по воздуху (OTA) было удалено. |
|
|
Снимок экрана был создан. |
|
|
Снимок экрана был удален. |
|
|
Снимок экрана был изменен или переименован. |
|
|
Список переводов был удален. |
|
|
Список переводов был включен. |
|
|
Список переводов был проверено. |
|
|
Список переводов был не проверено. |
|
|
Список переводов был не проверено. |
|
|
Список переводов был подтверждено. |
|
|
Перевод ключа на определенном языке был добавить. |
|
|
Перевод ключа на определенном языке был доставлен поставщиком языковых услуг. |
|
|
Перевод ключа на определенном языке был Исключить. |
|
|
Перевод ключа на определенном языке был включен. |
|
|
Перевод ключа на определенном языке был проверено. |
|
|
Перевод ключа на определенном языке был не проверено. |
|
|
Перевод ключа на определенном языке был не проверено. |
|
|
Перевод ключа на определенном языке был отредактирован. |
|
|
Перевод ключа на определенном языке был подтверждено. |
|
|
Файл языкового стандарта был успешно обработан. |
|
|
Файл языкового стандарта обрабатывается. |
Чтобы добавить вебхук, выполните следующие действия:
-
На странице прокрутите вниз до и нажмите Configure.
Откроется страница .
-
Нажмите «Добавить вебхук».
Откроется окно .
-
Укажите сведения о вебхуке.
-
При необходимости .
-
Нажмите «Сохранить». Указанный вебхук будет добавлен в список на странице .
Вебхук можно деактивировать в меню конкретного вебхука.
Чтобы протестировать вебхук:
-
На странице Выбрать вебхук и Выбрать «Отправить тестовое уведомление» в меню .
Отобразится уведомление о том, что тест прошел успешно.
Использовать такую услугу, как RequestBin, для захвата содержимого вебхука. RequestBin предоставляет URL-адрес, который собирает данные запроса для проверки.
POST-запрос отправляется на указанный URL-адрес обратного вызова каждый раз, когда происходит событие указанного типа. POST-полезная нагрузка запроса представляет собой документ в кодировке JSON с соответствующими данными о событии. Атрибуты event, message и sent_at будут включены всегда, наряду с дополнительными атрибутами, относящимися к событию, такими как пользователь, проект и ветвь, из которых был запущен вебхук.
Заголовки ответа
HTTP-запросы, отправленные на URL-адрес обратного вызова, будут содержать несколько специальных заголовков.
-
X-PhraseApp-Event: Тип события, которое вызвало вебхук. -
X-PhraseApp-Signature: HMAC-дайджест полезной нагрузки в шестнадцатеричном формате, использующий секрет хука в качестве ключа.
Например:
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": "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"
}
}