文章目录
当前版本
默认情况下,所有http://api.myblog.com
接收v3 版本的REST API的请求
Accept: application/vnd.myblog.v3+json
架构图
所有API访问都是通过HTTPS进行的,并且可以通过访问https://api.myblog.com
。所有数据都以JSON的形式发送和接收。
curl -i https://api.myblog.com/users/octocat/orgs
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 19 Nov 2019 23:33:14 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Status: 200 OK
ETag: "a00049ba79152d03380c34652f2cb612"
X-GitHub-Media-Type: github.v3
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4987
X-RateLimit-Reset: 1350085394
Content-Length: 5
Cache-Control: max-age=0, private, must-revalidate
X-Content-Type-Options: nosniff
包含空白字段,null
而不是将其省略。
所有时间戳以ISO 8601格式返回:
YYYY-MM-DDTHH:MM:SSZ
摘要表示
当您获取资源列表时,响应包括该资源的属性子集。这是资源的“摘要”表示。
查看发表的所有文章
GET /:username/articles
认证方式
有两种方法可以通过GitHub API v3进行身份验证。需要身份验证的请求在某些地方将返回404 Not Found
,而不是403 Forbidden
。这是为了防止私有存储库意外泄露给未经授权的用户。
基本认证
curl -u "username" https://api.myblog.com
OAuth2令牌(在标头中发送)
curl -H "Authorization: token OAUTH-TOKEN" https://api.myblog.com
OAuth2密钥/秘密
弃用通知: GitHub将使用查询参数终止对API的身份验证。对API的身份验证应使用HTTP基本身份验证完成。
curl 'https://api.myblog.com/users/whatever?client_id=xxxx&client_secret=yyyy'
使用您的client_id
,client_secret
并且不对用户进行身份验证,它只会识别您的OAuth应用程序以增加您的速率限制。权限仅授予用户,而不授予应用程序,并且您将仅取回未经身份验证的用户将看到的数据。因此,您仅应在服务器到服务器方案中使用OAuth2密钥/秘密。请勿将OAuth应用程序的客户端机密泄露给用户。
登录限制失败
使用无效的凭据进行身份验证将返回401Unauthorized
:
curl -i https://api.myblog.com -u foo:bar
HTTP/1.1 401 Unauthorized
{
"message": "Bad credentials",
"documentation_url": "https://developer.myblog.com/v3"
}
在短时间内检测到多个具有无效凭据的请求后,API会临时拒绝该用户的所有身份验证尝试(包括具有有效凭据的请求)403 Forbidden
:
curl -i https://api.github.com -u valid_username:valid_password
HTTP/1.1 403 Forbidden
{
"message": "Maximum number of login attempts exceeded. Please try again later.",
"documentation_url": "https://developer.github.com/v3"
}
参量
许多API方法采用可选参数。对于GET
请求,任何未在路径中指定为段的参数都可以作为HTTP查询字符串参数传递:
curl -i“ https://api.myblog.com/repos/vmg/redcarpet/issues?state=closed”
在此示例中,在查询字符串中传递路径时,为路径中的:owner
和:repo
参数提供了’vmg’和’redcarpet’值:state
。
对POST,PATCH,PUT,和DELETE的要求,不包含在URL参数应当被编码为JSON与“应用/ JSON”的内容类型:
curl -i -u username -d '{"scopes":["public_repo"]}' https://api.myblog.com/authorizations
根端点
您可以用GET
向根端点发出请求,以获取REST API v3支持的所有端点类别:
curl https://api.myblog.com
客户端错误
接收请求正文的API调用上可能存在三种类型的客户端错误:
- 发送无效的JSON将导致
400 Bad Request
响应。
HTTP/1.1 400 Bad Request
Content-Length: 35
{"message":"Problems parsing JSON"}
- 发送错误类型的JSON值将导致
400 Bad Request
响应。
HTTP/1.1 400 Bad Request
Content-Length: 40
{"message":"Body should be a JSON object"}
- 发送无效的字段将导致
422 Unprocessable Entity
响应。
HTTP/1.1 422 Unprocessable Entity
Content-Length: 149
{
"message": "Validation Failed",
"errors": [
{
"resource": "Issue",
"field": "title",
"code": "missing_field"
}
]
}
所有错误对象都具有资源和字段属性,以便您的客户端可以知道问题所在。还有一个错误代码,让您知道该字段出了什么问题。这些是可能的验证错误代码:
错误名称 | 描述 |
---|---|
missing | 意味着资源不存在 |
missing_field | 意味着尚未设置资源上的必填字段 |
invalid | 这意味着字段格式无效。该资源的文档应该能够为您提供更多具体信息 |
already_exists | 这意味着另一个资源具有与此字段相同的值。在必须具有某些唯一键(例如标签名称)的资源中可能会发生这种情况。 |
HTTP重定向
API v3在适当的地方使用HTTP重定向。客户应假定任何请求都可能导致重定向。接收HTTP重定向不是错误,客户端应遵循该重定向。重定向响应将具有一个 Location
标头字段,其中包含客户端应向其重复请求的资源的URI。
状态码 | 描述 |
---|---|
301 | 永久重定向。您用于发出请求的URI已被Location 标头字段中指定的URI取代。对此资源的此请求以及所有将来的请求都应定向到新URI。 |
302 , 307 | 临时重定向。应按Location 标头字段中指定的URI逐字重复请求,但客户端应继续将原始URI用于以后的请求。 |
HTTP动词
API v3尽可能在每个动作中使用适当的HTTP动词。
HEAD
: 可以针对任何资源发出以仅获取HTTP标头信息。GET
: 用于检索资源。POST
: 用于创建资源。PATCH
: 用于通过部分JSON数据更新资源。例如,问题资源具有title
和body
属性。PATCH请求可以接受一个或多个属性以更新资源。PATCH是一个相对较新且不常见的HTTP动词,因此资源端点也接受POST
请求。PUT
: 用于替换资源或集合。对于PUT
没有body
属性的请求,请确保将Content-Length
标头设置为零。DELETE
: 用于删除资源。
基本操作
登录
curl -u username:password https://api.myblog.com/v1
假设用名为zyh的账户登录
- 查看发表的所有文章
GET /:username/articles
curl -i -u https://api.myblog.com/v1/zyh/articles
- 查看特定的文章
GET /:username/articles/{id}
GET /:username/articles/{title}
curl -u -i https://api.myblog.com/v1/zyh/articles/1
curl -u -i https://api.myblog.com/v1/zyh/articles/bjyxszd
- 搜索文章
POST /:username/articles/?{id}{name}{data}
curl -u -i https://api.myblog.com/v1/zyh/articles?id=1&title=xxx&data=xxx
- 查看评论
GET /:username/articles/:id/comments
curl -i https://api.myblog.com/v1/zyh/articles/20/comments
- 新建评论
POST /:user/:id/comment
data //评论参数
{
"content":"xxx"
}
curl -u -i https://api.myblog.com/v1/zyh/articles/20/comments -d {"content":"xxx"}
- 发布文章
POST /:user/articles
data //发布文章的数据参数
{
"content":"",
"title":"",
"private": true/false,
"description":""
}
curl -u -i -d '{"title":"xxx","content":"xxx","private":false,"description":"xxx"}' https://api.myblog.com/v1/zyh/articles
- 删除文章
DELETE /:user/articles/{id}
- 修改文章
PUT /:user/articles/{id}
data
{
"content":"",
"title":"",
}
curl -u -i -d {"title":"","content":"xxx"} https://api.myblog.com/v1/zyh/articles/20/
超媒体
所有资源都可以具有一个或多个*_url
链接到其他资源的属性。这些旨在提供显式URL,以便适当的API客户端不需要自己构造URL。强烈建议API客户端使用这些。这样做将使开发人员将来更容易升级API。预期所有URL都是正确的RFC 6570 URI模板。
然后,您可以使用uri_template gem之类的东西来扩展这些模板:
>> tmpl = URITemplate.new('/notifications{?since,all,participating}')
>> tmpl.expand
=> "/notifications"
>> tmpl.expand :all => 1
=> "/notifications?all=1"
>> tmpl.expand :all => 1, :participating => 1
=> "/notifications?all=1&participating=1"
分页
默认情况下,返回多个项目的请求将被分页为30个项目。您可以使用?page
参数指定其他页面。对于某些资源,您还可以使用?per_page
参数设置最大100的自定义页面大小。请注意,出于技术原因,并非所有端点都遵守该?per_page
参数,例如请参阅事件。
curl'https://api.myblog.com/user/repos?page=2&per_page=100'
请注意,页码是基于1的,省略该?page
参数将返回第一页。
连接标题
该链接头包括分页信息:
Link: <https://api.myblog.com/user/repos?page=3&per_page=100>; rel="next", <https://api.myblog.com/user/repos?page=50&per_page=100>; rel="last"
此Link响应标头包含一个或多个超媒体链接关系,其中一些可能需要扩展为URI模板。
可能的rel值为:
名称 | 描述 |
---|---|
next | 结果的下一页的链接关系 |
last | 最后一页结果的链接关系 |
first | 结果首页的链接关系 |
prev | 前一页结果的链接关系 |
限速
对于使用基本身份验证或OAuth的API请求,您每小时最多可以进行5000个请求。无论使用了基本身份验证还是OAuth令牌,经过身份验证的请求都与经过身份验证的用户相关联 。这意味着,当用户授权的所有OAuth应用程序使用同一用户拥有的不同令牌进行身份验证时,它们每小时共享5000个请求的相同配额。
对于未经身份验证的请求,速率限制允许每小时最多60个请求。未经身份验证的请求与原始IP地址相关联,而不与发出请求的用户相关联。
请注意,Search API具有自定义速率限制规则。
任何API请求返回的HTTP标头都会显示您当前的速率限制状态:
curl -i https://api.myblog.com/users/octocat
HTTP/1.1 200 OK
Date: Tue, 19 Nov 2019 17:27:06 GMT
Status: 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 56
X-RateLimit-Reset: 1372700873
参数解释:
- X-RateLimit-Limit:每小时允许您发出的最大请求数。
- X-RateLimit-Remaining:当前速率限制窗口中剩余的请求数。
- X-RateLimit-Reset:当前速率限制窗口重置的时间,以UTC纪元秒为单位。
如果超出速率限制,则会返回错误响应:
HTTP/1.1 403 Forbidden
Date: Tue, 19 Nov 2019 14:50:41 GMT
Status: 403 Forbidden
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1377013266
{
"message": "API rate limit exceeded for xxx.xxx.xxx.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)",
"documentation_url": "https://developer.github.com/v3/#rate-limiting"
}
用户代理
所有API请求都必须包含有效的User-Agent
标头。没有User-Agent
标题的请求将被拒绝。我们要求您使用GitHub用户名或应用程序名称作为User-Agent
标头值
User-Agent: Awesome-Octocat-App
User-Agent默认情况下,cURL发送一个有效的头。如果您User-Agent通过cURL(或通过替代客户端)提供了无效的标头,则会收到403 Forbidden
响应:
curl -iH 'User-Agent: ' https://api.myblog.com/meta
HTTP/1.0 403 Forbidden
Connection: close
Content-Type: text/html
Request forbidden by administrative rules.
Please make sure your request has a User-Agent header.
Check https://developer.github.com for other possible causes.