{{< details >}}

  • Tier: 基础版,专业版,旗舰版
  • Offering: JihuLab.com,私有化部署

{{< /details >}}

当使用 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 GETPUTPATCHDELETE 请求成功,资源本身以 JSON 格式返回。
201 Created POST 请求成功,资源以 JSON 格式返回。
202 Accepted GETPUTDELETE 请求成功,资源已安排进行处理。
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_response 设置为 true
    • 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_site_key 通过适当的 CAPTCHA API 获取 CAPTCHA 响应值。
    • 重新提交请求,并设置 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"
      

错误:404 Not Found 使用反向代理时

如果您的极狐GitLab 实例使用反向代理,您可能会在使用极狐GitLab 编辑器扩展、极狐GitLab CLI 或带有 URL 编码参数的 API 调用时看到 404 Not Found 错误。

这个问题发生在您的反向代理在将参数传递给极狐GitLab 之前解码诸如 /?@ 等字符时。

要解决此问题,请编辑反向代理的配置:

  • VirtualHost 部分,添加 AllowEncodedSlashes NoDecode
  • Location 部分,编辑 ProxyPass 并添加 nocanon 标志。

例如:

{{< tabs >}}

{{< tab title=”Apache configuration” >}}

<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>

{{< /tab >}}

{{< tab title=”NGINX configuration” >}}

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

{{< /tab >}}

{{< /tabs >}}