正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

REST APIのトラブルシューティング

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

REST APIを使用しているときに、問題が発生する可能性があります。

トラブルシューティングを行うには、REST APIのステータスコードを参照してください。HTTPレスポンスヘッダーと終了コードを含めることも役立ちます。

ステータスコード

GitLab REST APIは、コンテキストとアクションに応じて、すべての応答でステータスコードを返します。リクエストによって返されるステータスコードは、トラブルシューティングを行う際に役立ちます。

次の表は、API機能の一般的な動作の概要を示しています。

リクエストタイプ説明
GET1つ以上のリソースにアクセスし、結果をJSONとして返します。
POSTリソースが正常に作成された場合は201 Createdを返し、新しく作成されたリソースをJSONとして返します。
GET / PUT / PATCHリソースへのアクセスまたは変更が正常に行われた場合は、200 OKを返します。(変更された)結果はJSONとして返されます。
DELETEリソースが正常に削除された場合は204 No Contentを返し、リソースが削除されるようにスケジュールされている場合は202 Acceptedを返します。

次の表に、APIリクエストで返される可能性のあるコードを示します。

戻り値説明
200 OKGETPUTPATCH、またはDELETEリクエストが成功し、リソース自体がJSONとして返されました。
201 CreatedPOSTリクエストが成功し、リソースがJSONとして返されました。
202 AcceptedGETPUT、またはDELETEリクエストが成功し、リソースが処理されるようにスケジュールされました。
204 No Contentサーバーはリクエストを正常に実行しましたが、応答ペイロード本文で送信する追加コンテンツはありません。
301 Moved Permanentlyリソースは、Locationヘッダーによって指定されたURLに明確に移動されました。
304 Not Modifiedリソースは、最後のリクエスト以降に変更されていません。
400 Bad RequestAPIリクエストに必要な属性がありません。たとえば、イシューのタイトルが指定されていません。
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_responsetrueに設定されます。
    • 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="<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" \
        --url "https://gitlab.example.com/api/v4/snippets?title=Title&file_name=FileName&content=Content&visibility=public"

エラー: リバースプロキシの使用時に404 Not Found

GitLabインスタンスがリバースプロキシを使用している場合、GitLab editor拡張機能、GitLab CLI、またはURLエンコードされたパラメータを使用したAPIコールを使用すると、404 Not Foundエラーが表示されることがあります。

この問題は、リバースプロキシがパラメータをGitLabに渡す前に、/?@などの文字をエンコード解除すると発生します。

この問題を解決するには、リバースプロキシの設定を編集します:

  • VirtualHostセクションで、AllowEncodedSlashes NoDecodeを追加します。
  • Locationセクションで、ProxyPassを編集し、nocanonフラグを追加します。

例:

<VirtualHost *:443>
  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

  <Location />
     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;
  }
}

詳細については、issue 18775を参照してください。