服务计算 | 博客网站的部分REST API设计

当前版本

默认情况下,所有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_idclient_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调用上可能存在三种类型的客户端错误:

  1. 发送无效的JSON将导致400 Bad Request响应。
HTTP/1.1 400 Bad Request
Content-Length: 35

{"message":"Problems parsing JSON"}
  1. 发送错误类型的JSON值将导致400 Bad Request响应。
HTTP/1.1 400 Bad Request
Content-Length: 40

{"message":"Body should be a JSON object"}
  1. 发送无效的字段将导致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数据更新资源。例如,问题资源具有titlebody属性。PATCH请求可以接受一个或多个属性以更新资源。PATCH是一个相对较新且不常见的HTTP动词,因此资源端点也接受POST请求。
  • PUT: 用于替换资源或集合。对于PUT没有body属性的请求,请确保将Content-Length标头设置为零。
  • DELETE: 用于删除资源。
基本操作

登录
curl -u username:password https://api.myblog.com/v1
假设用名为zyh的账户登录

  1. 查看发表的所有文章
GET /:username/articles
curl -i -u https://api.myblog.com/v1/zyh/articles
  1. 查看特定的文章
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
  1. 搜索文章
POST /:username/articles/?{id}{name}{data}
curl -u -i https://api.myblog.com/v1/zyh/articles?id=1&title=xxx&data=xxx
  1. 查看评论
GET /:username/articles/:id/comments
curl -i https://api.myblog.com/v1/zyh/articles/20/comments

  1. 新建评论
POST /:user/:id/comment
data //评论参数
{
	"content":"xxx"
}

curl -u -i https://api.myblog.com/v1/zyh/articles/20/comments -d {"content":"xxx"}
  1. 发布文章
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

  1. 删除文章
DELETE /:user/articles/{id}
  1. 修改文章
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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值