如何优化为Mobile app写的RESTful API
1. 移动应用访问的后端跟其他后端的区别
- 使用https,每个endpoint使用同一类证书
- Server承担大部分的计算任务
- 请求失败要有清楚的错误码和错误信息
- api 版本控制
- 支持push
2.设计RESTful API时应该考虑的东西
- 自己搭建服务器还是使用云
- 保护数据:https,每个endpoint的访问都需要认证,加密敏感数据
- 开发环境:development, staging,production
- 数据库选择:MySql 最稳定,以UUID作entity id
- 选择正确的工具: 团队交流工具,进度可见,api 文档, test suite as document。
- 支持多种客户端:pagination of long list result, client determine the number of results, include device name, os version, os type in header
3.如何实现RESTful API
- url 由动词和名词构成,动词是GET, POST, PUT, PATCH, DELETE, 名词就是url path,如
GET /books
POST /books
GET /books/{bookId}
PUT /books/{bookId}
PATCH /books/{bookId}
DELETE /books/{bookId}
GET /books/{bookId}/authors
GET /bookClubs/book
GET /users/{userId}
GET /users/{userId}/favoriteBooks
通过url 参数使得client可以对数据进行筛选
GET /libraries?sortBy=name&isCurrentlyOpen=true&pageCount=10
GET /books?queryTitle=Sherlock+Holmes&queryAuthor=Arthur+Conan+Doyle
GET /bookClubs?genre=mystery
在 url 加入版本控制:
GET /v1/books
GET /v2/books
request 和 response中缺失的field,不要假定为null
用response code标示请求结果
Json key保持同样的命名规则,驼峰或者下划线,不要混用
不要包装数据
GET /authors?genre=mystery
{
"data": {
[{ "authorName": "Arthur Conan Doyle",
...
}]
}
}
当返回数据只有一个时,也要返回数组
GET /authors?genre=mystery
{
"authorName": "Arthur Conan Doyle",
...
}
不要在响应中包含冗余数据
GET /authors?genre=mystery
{
"requestInfo": {
"genre": "mystery"
},
[{
"authorName": "Arthur Conan Doyle",
...
}]
}
请求和响应中的时间一律使用 ISO 8601 format with UTC values
Reference
https://savvyapps.com/blog/how-to-build-restful-api-mobile-app