REST API 트러블슈팅
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
REST API를 사용할 때 문제가 발생할 수 있습니다. 트러블슈팅하려면 REST API 상태 코드를 참조하세요. GitLab REST API는 컨텍스트와 작업에 따라 모든 응답과 함께 상태 코드를 반환합니다. 다음 표는 API가 일반적으로 동작하는 방식에 대한 개요를 제공합니다.
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 --request GET \
--include \
--url "https://gitlab.example.com/api/v4/projects"
HTTP/2 200
...
HTTP 종료 코드 포함#
API 응답의 HTTP 종료 코드는 트러블슈팅 시 추가 정보를 제공할 수 있습니다.
HTTP 종료 코드를 포함하려면 --fail 옵션을 포함합니다:
curl --request GET \
--fail \
--url "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_response가true로 설정됨.spam_log_id및captcha_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_site_key로 CAPTCHA 응답 값을 가져옵니다. Google reCAPTCHA v2만 지원됩니다. -
X-GitLab-Captcha-Response및X-GitLab-Spam-Log-Id헤더를 설정하여 요청을 다시 제출합니다.export CAPTCHA_RESPONSE="" 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" \ --url "https://gitlab.example.com/api/v4/snippets?title=Title&file_name=FileName&content=Content&visibility=public"
오류: 리버스 프록시를 사용할 때 404 Not Found#
GitLab 인스턴스가 리버스 프록시를 사용하는 경우 GitLab 편집기 확장, GitLab CLI 또는 URL 인코딩된 매개변수가 있는 API 호출을 사용할 때 404 Not Found 오류가 발생할 수 있습니다.
이 문제는 리버스 프록시가 매개변수를 GitLab으로 전달하기 전에 /, ?, @와 같은 문자를 디코딩할 때 발생합니다.
이 문제를 해결하려면 리버스 프록시의 구성을 편집합니다:
VirtualHost섹션에서AllowEncodedSlashes NoDecode를 추가합니다.Location섹션에서ProxyPass를 편집하고nocanon플래그를 추가합니다.
예:
ServerName git.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/git.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/git.example.com/privkey.pem
SSLVerifyClient None
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
ProxyPass http://127.0.0.1:8080/ nocanon
ProxyPassReverse http://127.0.0.1:8080/
Order deny,allow
Allow from all
</Location>
</VirtualHost>
server {
listen 80;
server_name gitlab.example.com;
location / {
proxy_pass http://ip:port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300;
proxy_connect_timeout 300;
}
}
자세한 내용은 이슈 18775를 참조하세요.
지원 지식베이스#
여전히 문제가 있는 경우 GitLab 지원 지식베이스를 참조하세요.
