REST API 문제 해결

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

REST API 작업 시 문제가 발생할 수 있습니다.

문제를 해결하기 위해 REST API 상태 코드를 참조하세요. HTTP 응답 헤더와 종료 코드를 포함하는 것도 도움이 될 수 있습니다.

상태 코드

GitLab REST API는 컨텍스트와 작업에 따라 모든 응답에 상태 코드를 반환합니다. 요청에서 반환된 상태 코드는 문제 해결 시 유용할 수 있습니다.

다음 표는 API 기능이 일반적으로 어떻게 작동하는지를 개략적으로 보여줍니다.

요청 유형 설명
GET 하나 이상의 리소스에 접근하고 결과를 JSON 형식으로 반환합니다.
POST 리소스가 성공적으로 생성되면 201 Created를 반환하고 새로 생성된 리소스를 JSON 형식으로 반환합니다.
GET / PUT / PATCH 리소스에 성공적으로 접근하거나 수정되면 200 OK를 반환합니다. (수정된) 결과가 JSON 형식으로 반환됩니다.
DELETE 리소스가 성공적으로 삭제되면 204 No Content를 반환하거나, 리소스가 삭제 예정인 경우 202 Accepted를 반환합니다.

다음 표는 API 요청에 대한 가능한 반환 코드를 보여줍니다.

반환 값 설명
200 OK GET, PUT, PATCH 또는 DELETE 요청이 성공적이었고 리소스 자체가 JSON 형식으로 반환됩니다.
201 Created POST 요청이 성공적이었고 리소스가 JSON 형식으로 반환됩니다.
202 Accepted GET, PUT 또는 DELETE 요청이 성공적이었고 리소스가 처리 대기 중입니다.
204 No Content 서버가 요청을 성공적으로 처리하였고, 응답 페이로드 본문에 추가 콘텐츠를 보낼 필요가 없습니다.
301 Moved Permanently 리소스가 Location 헤더에 의해 제공된 URL로 영구적으로 이동되었습니다.
304 Not Modified 리소스가 마지막 요청 이후로 수정되지 않았습니다.
400 Bad Request API 요청의 필수 속성이 누락되었습니다. 예를 들어, 이슈의 제목이 제공되지 않았습니다.
401 Unauthorized 사용자가 인증되지 않았습니다. 유효한 사용자 토큰이 필요합니다.
403 Forbidden 요청이 허용되지 않습니다. 예를 들어, 사용자가 프로젝트를 삭제할 수 없습니다.
404 Not Found 리소스에 접근할 수 없었습니다. 예를 들어, 리소스의 ID를 찾을 수 없거나 사용자가 리소스에 접근할 수 있는 권한이 없습니다.
405 Method Not Allowed 요청이 지원되지 않습니다.
409 Conflict 충돌하는 리소스가 이미 존재합니다. 예를 들어, 이미 존재하는 이름으로 프로젝트를 생성하는 경우입니다.
412 Precondition Failed 요청이 거부되었습니다. 이것은 If-Unmodified-Since 헤더가 제공되었을 때, 수정된 리소스를 삭제하려고 시도하는 경우 발생할 수 있습니다.
422 Unprocessable 엔터티를 처리할 수 없습니다.
429 Too Many Requests 사용자가 애플리케이션 비율 한도를 초과했습니다.
500 Server Error 요청을 처리하는 중에 서버에서 문제가 발생했습니다.
503 Service Unavailable 서버가 일시적으로 과부하로 인해 요청을 처리할 수 없습니다.

상태 코드 400

API를 사용할 때 유효성 검사 오류가 발생할 수 있으며, 이 경우 API는 HTTP 400 오류를 반환합니다.

다음과 같은 경우에 이러한 오류가 발생합니다:

  • API 요청의 필수 속성이 누락된 경우 (예: 이슈의 제목이 제공되지 않음).
  • 속성이 유효성 검사를 통과하지 못한 경우 (예: 사용자 바이오가 너무 긴 경우).

속성이 누락되면 다음과 같은 응답을 받게 됩니다:

HTTP/1.1 400 Bad Request
Content-Type: application/json
{
    "message":"400 (Bad request) \"title\" not given"
}

유효성 검사 오류가 발생하면 오류 메시지가 다릅니다. 그들은 유효성 검사 오류에 대한 모든 세부 정보를 포함합니다:

HTTP/1.1 400 Bad Request
Content-Type: application/json
{
    "message": {
        "bio": [
            "is too long (maximum is 255 characters)"
        ]
    }
}

이는 오류 메시지를 기계가 읽기 더 쉽게 만듭니다. 형식은 다음과 같이 설명할 수 있습니다:

{
    "message": {
        "<property-name>": [
            "<error-message>",
            "<error-message>",
            ...
        ],
        "<embed-entity>": {
            "<property-name>": [
                "<error-message>",
                "<error-message>",
                ...
            ],
        }
    }
}

HTTP 응답 헤더 포함

HTTP 응답 헤더는 문제 해결 시 추가 정보를 제공할 수 있습니다.

응답에 HTTP 응답 헤더를 포함하려면 --include 옵션을 사용하세요:

curl --include "https://gitlab.example.com/api/v4/projects"
HTTP/2 200
...

HTTP 종료 코드 포함

API 응답의 HTTP 종료 코드는 문제 해결 시 추가 정보를 제공할 수 있습니다.

HTTP 종료 코드를 포함하려면 --fail 옵션을 포함하세요:

curl --fail "https://gitlab.example.com/api/v4/does-not-exist"
curl: (22) The requested URL returned error: 404

스팸으로 감지된 요청

REST API 요청이 스팸으로 감지될 수 있습니다. 요청이 스팸으로 감지되면:

  • CAPTCHA 서비스가 구성되지 않은 경우, 오류 응답이 반환됩니다. 예를 들어:

    {"message":{"error":"Your snippet has been recognized as spam and has been discarded."}}
    
  • CAPTCHA 서비스가 구성된 경우, 다음과 같은 응답을 받게 됩니다:

    • needs_captcha_responsetrue로 설정됩니다.
    • spam_log_idcaptcha_site_key 필드가 설정됩니다.

    예를 들어:

    {"needs_captcha_response":true,"spam_log_id":42,"captcha_site_key":"REDACTED","message":{"error":"Your snippet has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."}}
    
    • 적절한 CAPTCHA API를 사용하여 CAPTCHA 응답 값을 얻기 위해 captcha_site_key를 사용하십시오. 지원되는 것은 Google reCAPTCHA v2입니다.
    • X-GitLab-Captcha-ResponseX-GitLab-Spam-Log-Id 헤더를 설정하여 요청을 다시 제출합니다.

      export CAPTCHA_RESPONSE="<CAPTCHA response obtained from CAPTCHA service>"
      export SPAM_LOG_ID="<spam_log_id obtained from initial REST response>"
      curl --request POST --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" --header "X-GitLab-Captcha-
      Response: $CAPTCHA_RESPONSE" --header "X-GitLab-Spam-Log-Id: $SPAM_LOG_ID"
      "https://gitlab.example.com/api/v4/snippets?
      title=Title&file_name=FileName&content=Content&visibility=public"