웹 후크는 채팅 클라이언트 또는 기타 외부 API와 같은 외부 서비스에 이벤트를 알립니다. 특정 이벤트가 발생할 때 웹 후크는 URL을 설정할 수 있습니다.
중요 사항
파일 업로드는 uploads:create 및 uploads:processing 웹 후크 이벤트만 트리거합니다.
keys:create, keys:update, translations:create 및 translations:update 웹 후크 이벤트는 파일 업로드 또는 자동 가져오기에 의해 트리거되지 않습니다:
웹 후크 기록에 대한 보존 기간은 30일입니다.
웹 후크 응답
웹 후크 엔드포인트는 콜백을 수신한 후 5초 이내에 200–299 범위의 HTTP 상태 코드를 반환해야 합니다. 기타 상태 코드 및 요청 시간 초과는 배달 실패로 간주됩니다. 배달이 10개 이상의 연속 이벤트에 대해 실패하면 웹 후크가 비활성화됩니다. 콜백은 반복되지 않습니다.
콜백을 수신하는 경우 5초 요청 시간 초과 기간 내에 응답하십시오. 응용 프로그램이 우연히 시간 초과를 트리거하지 않도록 HTTP 응답이 전송된 후에 처리를 연기하십시오.
웹후크 요청 무결성
각 웹후크 요청에는 웹후크 검증 토큰을 비밀로 사용하여 요청에 전송된 데이터와 함께 생성된 X-PhraseApp-Signature 헤더가 포함됩니다. 요청 본문의 HMAC 다이제스트를 계산하고 이를 X-PhraseApp-Signature 헤더의 값과 비교하여 요청 출처를 확인합니다.
예시:
루비
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:create는 https://app.phrase.com/webhook_schemas/branches_create.json를 통해 접근할 수 있습니다.
|
이벤트 이름 |
설명 |
|---|---|
|
|
브랜치가 생성되었습니다. |
|
|
브랜치가 병합되었습니다. |
|
|
번역 키에 대한 주석이 추가되었습니다. |
|
|
사용자 지정 메타데이터 필드 값이 여러 키에서 업데이트되었습니다. |
|
|
사용자 지정 메타데이터 필드 값이 키 수준에서 업데이트되었습니다. |
|
|
작업이 완료로 표시되었습니다. |
|
|
작업이 생성되었습니다. |
|
|
작업의 로캘이 완료로 표시되었습니다. |
|
|
작업의 로캘이 다시 열렸습니다. |
|
|
작업의 로캘이 검토되었고 완료로 표시되었습니다. |
|
|
작업의 로캘이 검토되었고 다시 열렸습니다. |
|
|
작업이 다시 열렸습니다. |
|
|
작업이 시작되었습니다. |
|
|
작업이 업데이트되었습니다. |
|
|
여러 키가 삭제되었습니다. |
|
|
키가 생성되었습니다. |
|
|
키가 삭제되었습니다. |
|
|
여러 키에 태그가 추가되었습니다. |
|
|
키에 태그가 추가되었습니다. |
|
|
키의 이름이 변경되거나 수정되었습니다. |
|
|
프로젝트에 새로운 언어 버전이 생성되었습니다. |
|
|
언어 버전이 삭제되었습니다. |
|
|
언어 버전이 변경되거나 이름이 바뀌거나 재구성되었습니다. |
|
|
프로젝트가 변경되거나 재구성되었습니다. |
|
|
OTA 릴리스가 생성되었습니다. |
|
|
OTA 릴리스가 삭제되었습니다. |
|
|
스크린샷이 생성되었습니다. |
|
|
스크린샷이 삭제되었습니다. |
|
|
스크린샷이 변경되거나 이름이 바뀌었습니다. |
|
|
번역 목록이 삭제되었습니다. |
|
|
번역 목록이 포함되었습니다. |
|
|
번역 목록이 검토되었습니다. |
|
|
번역 목록이 검토되지 않았습니다. |
|
|
번역 목록이 확인되지 않았습니다. |
|
|
번역 목록이 확인되었습니다. |
|
|
특정 언어 버전의 키 번역이 추가되었습니다. |
|
|
특정 언어 버전의 키 번역이 언어 서비스 제공자에 의해 전달되었습니다. |
|
|
특정 언어 버전의 키 번역이 제외되었습니다. |
|
|
특정 언어 버전의 키 번역이 포함되었습니다. |
|
|
특정 언어 버전의 키 번역이 검토되었습니다. |
|
|
특정 언어 버전의 키 번역이 검토되지 않았습니다. |
|
|
특정 언어 버전의 키 번역이 확인되지 않았습니다. |
|
|
특정 언어 버전의 키 번역이 수정되었습니다. |
|
|
특정 언어 버전의 키 번역이 확인되었습니다. |
|
|
로캘 파일이 성공적으로 처리되었습니다. |
|
|
로캘 파일이 처리되고 있습니다. |
웹 후크를 추가하려면 다음 단계를 따르십시오:
-
페이지에서 아래로 스크롤하여 를 클릭하고 구성을 클릭합니다.
페이지가 열립니다.
-
웹 후크 추가를 클릭합니다.
창이 열립니다.
-
웹 후크 세부정보를 제공합니다.
-
선택적으로 .
-
저장을 클릭합니다. 지정된 웹 후크가 페이지의 목록에 추가됩니다.
특정 웹 후크의 메뉴에서 웹 후크를 비활성화할 수 있습니다.
웹 후크를 테스트하려면:
웹 후크의 내용을 캡처하기 위해 RequestBin과 같은 서비스를 사용합니다. RequestBin은 검사를 위해 요청 데이터를 수집하는 URL을 제공합니다.
지정된 유형의 이벤트가 발생할 때마다 지정된 콜백 URL로 POST 요청이 전송됩니다. 요청의 POST 페이로드는 이벤트에 대한 관련 데이터가 포함된 JSON 인코딩 문서입니다. 속성 event, message 및 sent_at는 항상 포함되며, 웹 후크가 트리거된 이벤트와 관련된 추가 속성인 사용자, 프로젝트 및 분기도 포함됩니다.
응답 헤더
콜백 URL로 전송된 HTTP 요청에는 여러 개의 특수 헤더가 포함됩니다.
-
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"
}
}