模仿 Github,设计一个博客网站的 API
概述
本次作业需要设计一个博客网站,而首先需要明确博客网站所需的功能。博客网站要管理的主要是用户与博客,所以需要设计的API也围绕这两个来设计。除此之外,还有一些认证功能需要实现。
REST API的介绍
REST全称为Representational State Transfer,是表现层状态转化的意思。REST API 是前后端分离最佳实践,是开发的一套标准或者说是一套规范,不是框架。它的好处有:
1、直接通过http,不需要额外的协议,通常有post/get/put/deletec操作。
2、面向资源,一目了然,具有自解释性。
3、数据描述简单,一般通过json或者xml做数据通讯。
所有 API 访问都是通过 HTTPS 进行的,并且可以通过访问 https://api.blog.com。所有数据都以 JSON 的形式发送和接收。
curl -i https://api.blog.com/users/lsc
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 20 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: blog.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 /user/blogs
用户认证
POST /users /Regesiter
参数:
名字 类型 描述
username string 用户名
password string 密码
email string 邮箱地址
… … …
响应:
Status: 200 OK
{
“isRegesiter” : "true"
"id": 1
"user_name": " ",
"created_at": "2019-11-20T00:00:00Z"
}
Login
POST /login
参数:
名字 类型 描述
username string 用户名
password string 密码
… … …
响应:
Status: 200 OK
------------------------------------------------------------------------
{
{
“isLogin” : "true"
"username": "Zhangqzh"
"created_at": "2019-11-20T00:00:00Z"
"updated_at": "2019-11-20T01:00:00Z"
}
使用无效的凭据进行身份验证将返回401 Unauthorized:
curl -i https://api.exampel.com -u foo:bar
HTTP / 1.1 401未经授权的
{
“ message”:“错误的凭据”,
...
}
在短时间内检测到多个具有无效凭据的请求后,API会临时拒绝该用户的所有身份验证尝试(包括具有有效凭据的请求)403 Forbidden:
curl -i https://api.exampel.com -u valid_username:valid_password
HTTP / 1.1 403禁止
{
“ message”:“已超过最大登录尝试次数。请稍后再试。”,
...
}
Method
Verb | Descreption |
---|---|
HEAD | 只获取某个资源的头部信息。比如只想了解某个文件的大小,某个资源的修改日期等 |
GET | 获取资源 |
POST | 创建资源 |
PATCH | 更新资源的部分属性。因为 PATCH 比较新,而且规范比较复杂,所以真正实现的比较少,一般都是用 POST 替代 |
PUT | 替换 |
DELETE | 删除资源 |
例如:
GET /repos/:owner/:repo/issues
GET /repos/:owner/:repo/issues/:number
POST /repos/:owner/:repo/issues
PATCH /repos/:owner/:repo/issues/:number
DELETE /repos/:owner/:repo
状态码
对于客户端来说。状态码都是三位的整数,大概分成了几个区间:
2XX | 请求正常处理并返回 |
---|---|
3XX | 重定向,请求的资源位置发生变化 |
4XX | 客户端发送的请求有错误 |
5XX | 服务器端错误 |
详细状态码小伙伴可以参考Http Stauses