{{< 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 |
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_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_site_key
通过适当的 CAPTCHA API 获取 CAPTCHA 响应值。 -
重新提交请求,并设置
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" "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 >}}