模仿 Github 设计一个博客网站的 API
REST
**REST**即表述性状态传递(Representational State Transfer)是一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
规范
- 协议:所有API访问都通过HTTPS
- 域名:访问
https://api.example.com
- 数据:所有数据都使用JSON格式发送和接收
- 响应码:2XX表示成功,4XX或5XX表示失败
API
登录账户
curl -i https://api.example.com -u username:password
失败:
HTTP/1.1 401 Unauthorized
{
"message": "Bad credentials",
"documentation_url": "https://developer.example.com"
}
成功:
HTTP/1.1 200 OK
{
"message": "Bad credentials",
"documentation_url": "https://developer.example.com"
}
查看某用户所有文章
curl -a https://api.example.com/user/articles
HTTP/1.1 200 OK
{
"username":"user"
"total_count": 10,
"articles":[
{
"articleID": 1,
"title": "Title",
"owner": {
"name": "ownerName",
"id": 1,
"url": "url",
"type": "***"
},
"article_url": "url"
"private": false,
"created_at": "2019-11-23T00:00:00Z",
"updated_at":"2019-11-23T00:00:00Z",
"words": 6666,
"visited":111,
"language": "Chinese",
"content":"...."
},
...
]
}
查看特定的文章
GET /:username/articles/{id}
curl -u -i https://api.example.com/user/articles/1
GET /:username/articles/{title}
curl -u -i https://api.example.com/user/articles/worlds
创建文章
POST /:user/articles
curl -u -i -d '{"title":"title","content":"content","private":false}' https://api.example.com/user/articles
HTTP/1.1 200 OK
{
"articleID": 2,
"title": "title",
"owner": {
"name": "user",
"id": 1,
"url": "url",
"type": "***"
},
"article_url": "url"
"private": false,
"created_at": "2019-11-23T00:10:00Z",
"updated_at":"2019-11-23T00:10:00Z",
"words": 777,
"visited":100,
"language": "Chinese",
"content":"...."
}
删除文章
DELETE /:user/articles/{id}
DELETE /:user/articles/{title}
查看评论
GET /:username/articles/:id/comments
curl -i https://api.example.com/user/articles/1/comments
HTTP/1.1 200 OK
{
"id": 1,
"author": "user",
"url": "xxx",
items:[{
"contents":"xxx",
"user": {
"id": 2,
"name":"user1"
"url": "xxx",
"type": "***",
"site_admin": false
},
....
]
"created_at": "2019-11-11T00:00:00Z",
"updated_at": "2019-11-11T00:00:00Z"
}
创建评论
curl -u -i https://api.example.com/user/articles/1/comments -d {"contents":"xxx"}
HTTP/1.1 200 OK
{
"contents":"xxx",
"user": {
"id": 3,
"name":"user2"
"url": "xxx",
"type": "***",
"site_admin": false
},
"created_at": "2019-12-12T00:00:00Z",
}