GraphQL API
GraphQL은 API용 질의 언어입니다. 원하는 정확한 데이터를 요청하여 필요한 요청 수를 제한할 수 있습니다.
GraphQL 데이터는 타입으로 구성되어 있으므로 클라이언트는 클라이언트 측 GraphQL 라이브러리를 활용하여 API를 사용하고 매뉴얼 구문 분석을 피할 수 있습니다.
GraphQL API는 버전 없음입니다.
시작하기
GitLab GraphQL API를 처음 사용하는 경우 GitLab GraphQL API로 시작하기를 참조하십시오.
GraphQL API 참조에서 사용 가능한 리소스를 확인할 수 있습니다.
GitLab GraphQL API 엔드포인트는 /api/graphql
에 위치해 있습니다.
대화형 GraphQL 탐색기
대화형 GraphQL 탐색기를 사용하여 GraphQL API를 살펴보세요:
- GitLab.com.
- Self-Managed형 GitLab 인스턴스에서
https://<your-gitlab-site.com>/-/graphql-explorer
로 이동합니다.
추가 정보는 GraphiQL을 참조하십시오.
GraphQL 예제 보기
GitLab.com의 공개 프로젝트에서 데이터를 추출하는 샘플 쿼리를 사용할 수 있습니다:
시작하기 페이지에서 GraphQL 쿼리를 사용자 정의하는 다양한 방법을 확인할 수 있습니다.
인증
일부 쿼리는 인증 없이 액세스할 수 있지만 다른 쿼리는 인증이 필요합니다. 항상 변이에는 인증이 필요합니다.
다음 중 하나를 사용하여 인증할 수 있습니다.
인증 정보가 유효하지 않으면 GitLab은 상태 코드 401
의 오류 메시지를 반환합니다:
{"errors":[{"message":"Invalid token"}]}
토큰 인증
다음과 같은 토큰 중 하나를 사용하여 GraphQL API에 인증할 수 있습니다:
헤더를 통해 토큰으로 인증 예시:
curl "https://gitlab.com/api/graphql" --header "Authorization: Bearer <token>" \
--header "Content-Type: application/json" --request POST \
--data "{\"query\": \"query {currentUser {name}}\"}"
매개변수로 OAuth 2.0 토큰 사용 예시:
curl "https://gitlab.com/api/graphql?access_token=<oauth_token>" \
--header "Content-Type: application/json" --request POST \
--data "{\"query\": \"query {currentUser {name}}\"}"
private_token
매개변수를 사용하여 개인, 프로젝트, 또는 그룹 액세스 토큰을 전달할 수 있습니다:
curl "https://gitlab.com/api/graphql?private_token=<access_token>" \
--header "Content-Type: application/json" --request POST \
--data "{\"query\": \"query {currentUser {name}}\"}"
토큰에는 올바른 범위가 필요합니다.
헤더 인증
Authorization: Bearer <token>
요청 헤더를 사용하여 토큰 인증하는 예시:
curl "https://gitlab.com/api/graphql" --header "Authorization: Bearer <token>" \
--header "Content-Type: application/json" --request POST \
--data "{\"query\": \"query {currentUser {name}}\"}"
매개변수 인증
access_token
매개변수를 사용하여 OAuth 2.0 토큰을 사용하는 예시:
curl "https://gitlab.com/api/graphql?access_token=<oauth_token>" \
--header "Content-Type: application/json" --request POST \
--data "{\"query\": \"query {currentUser {name}}\"}"
private_token
매개변수를 사용하여 개인, 프로젝트, 또는 그룹 액세스 토큰을 전달할 수 있습니다:
curl "https://gitlab.com/api/graphql?private_token=<access_token>" \
--header "Content-Type: application/json" --request POST \
--data "{\"query\": \"query {currentUser {name}}\"}"
토큰 범위
GraphQL API에 액세스하려면 토큰에 올바른 범위가 필요합니다:
범위 | 액세스 |
---|---|
read_api
| API에 대한 읽기 액세스를 부여합니다. 쿼리에 충분합니다. |
api
| API에 대한 읽기 및 쓰기 액세스를 부여합니다. 변이에서 필요합니다. |
세션 쿠키 인증
GitLab GraphQL API에서 id
필드는 거의 항상 글로벌 ID이며 절대로 데이터베이스 기본 키 ID가 아닙니다. GitLab GraphQL API의 글로벌 ID는 "gid://gitlab/"
로 시작합니다. 예: "gid://gitlab/Issue/123"
.
글로벌 ID는 일부 클라이언트 측 라이브러리에서 캐싱 및 검색에 사용되는 관행입니다.
GitLab 글로벌 ID는 변경될 수 있습니다. 예전 글로벌 ID를 인자로 사용하는 것은 폐기 및 변경 프로세스에 따라 지원되지 않게 되며 캐시된 글로벌 ID가 GitLab GraphQL 폐기 주기 이후 유효할 것으로 기대해서는 안 됩니다.
사용 가능한 최상위 쿼리
모든 쿼리를 위한 최상위 엔트리 포인트는 GraphQL 참조의 Query
타입에 정의되어 있습니다.
다중 쿼리
GitLab은 쿼리를 단일 요청으로 묶는 다중 쿼리를 지원합니다. 자세한 내용은 다중화를 참조하십시오.
폐기 및 변경
GitLab GraphQL API는 버전 없음이며 API의 변경은 주로 하위 호환성을 유지하는 방향으로 진행합니다.
그러나 GitLab은 때로는 하위 호환성을 유지하지 않는 방식으로 GraphQL API를 변경할 때가 있습니다. 이러한 변경은 폐기 및 변경으로 간주되며 필드, 인자 또는 스키마의 기타 부분을 제거하거나 이름을 변경하는 것을 포함할 수 있습니다. GitLab은 폐기 및 제거 프로세스를 따릅니다.
폐지 예시
아래 필드들은 서로 다른 소품릴리스에서 폐지되었지만, 둘 다 GitLab 17.0에서 제거되었습니다:
폐지된 버전 | 이유 |
---|---|
15.7 | GitLab은 전통적으로 주 버전당 12개의 소품릴리스를 가지고 있습니다. 이 필드가 6개의 릴리스 동안 사용 가능하도록 하기 위해, 이것은 17.0 주 버전에서(16.0이 아닌) 제거되었습니다. |
16.6 | 17.0에서의 제거로 6개월 동안 사용 가능합니다. |
제거된 아이템 디렉터리
이전 릴리스에서 제거된 아이템 디렉터리을 확인하세요.
제한 사항
다음 제한 사항들이 GitLab GraphQL API에 적용됩니다.
제한 | 기본값 |
---|---|
최대 페이지 크기 | 페이지당 100개 레코드(노드)입니다. API의 대부분의 연결에 적용됩니다. 특정 연결은 더 높거나 낮은 다른 최대 페이지 크기 제한을 가질 수 있습니다. |
최대 쿼리 복잡성 | 비인증 요청에 대해서는 200, 인증된 요청에 대해서는 250입니다. |
요청 시간 초과 | 30초. |
최대 쿼리 크기 | 쿼리 또는 뮤테이션 당 10,000자 입니다. 이 제한에 도달하면 변수와 fragment를 사용하여 쿼리나 뮤테이션 크기를 줄이세요. 마지막 수단으로 공백을 제거하세요. |
최대 쿼리 복잡성
GitLab GraphQL API는 쿼리의 _복잡성_을 평가합니다. 일반적으로, 더 큰 쿼리는 더 높은 복잡성 점수를 갖습니다. 이 제한은 API가 전반적인 성능에 부정적인 영향을 미칠 수 있는 쿼리를 수행하는 것으로부터 API를 보호하는 데 사용됩니다.
쿼리의 복잡성 점수와 요청 제한을 확인할 수 있습니다.
쿼리가 복잡성 제한을 초과하는 경우, 에러 메시지 응답이 반환됩니다.
일반적으로, 쿼리의 각 필드는 복잡성 점수에 1
을 추가하지만, 특정 필드의 경우에는 더 높거나 낮을 수 있습니다. 때로는 특정 인수를 추가하는 것이 쿼리의 복잡성을 증가시킬 수도 있습니다.
스팸으로 감지된 변경 사항 처리
GraphQL 뮤테이션은 스팸으로 감지될 수 있습니다. 만약 뮤테이션이 스팸으로 감지되고:
-
CAPTCHA 서비스가 구성되어 있지 않은 경우, GraphQL 상위 레벨 에러가 발생합니다. 예를 들어:
{ "errors": [ { "message": "요청이 거부되었습니다. 스팸이 탐지되었습니다", "locations": [ { "line": 6, "column": 7 } ], "path": [ "updateSnippet" ], "extensions": { "spam": true } } ], "data": { "updateSnippet": { "snippet": null } } }
- CAPTCHA 서비스가 구성되어 있는 경우, 다음과 같은 응답이 반환됩니다:
-
needsCaptchaResponse
가true
로 설정됩니다. -
spamLogId
및captchaSiteKey
필드가 설정됩니다.
예를 들어:
{ "errors": [ { "message": "요청이 거부되었습니다. CAPTCHA 도전을 해결하고 다시 시도하세요", "locations": [ { "line": 6, "column": 7 } ], "path": [ "updateSnippet" ], "extensions": { "needsCaptchaResponse": true, "captchaSiteKey": "6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI", "spamLogId": 67 } } ], "data": { "updateSnippet": { "snippet": null, } } }
-
-
captchaSiteKey
를 사용하여 적절한 CAPTCHA API를 통해 CAPTCHA 응답 값을 얻습니다. 오직 Google reCAPTCHA v2가 지원됩니다. -
X-GitLab-Captcha-Response
및X-GitLab-Spam-Log-Id
헤더를 설정하여 요청을 재제출합니다.
--data-binary
를 사용하여 JSON-임베디드 쿼리 내의 이스케이프된 이중 따옴표를 적절하게 처리합니다.export CAPTCHA_RESPONSE="<CAPTCHA 서비스에서 얻은 CAPTCHA 응답>"
export SPAM_LOG_ID="<최초 REST 응답에서 얻은 spam_log_id>"
curl --header "Authorization: Bearer $PRIVATE_TOKEN" --header "Content-Type: application/json" --header "X-GitLab-Captcha-Response: $CAPTCHA_RESPONSE" --header "X-GitLab-Spam-Log-Id: $SPAM_LOG_ID" --request POST --data-binary '{"query": "mutation {createSnippet(input: {title: \"Title\" visibilityLevel: public blobActions: [ { action: create filePath: \"BlobPath\" content: \"BlobContent\" } ] }) { snippet { id title } errors }}"}' "https://gitlab.example.com/api/graphql"