[给创业公司的原生云] ⑥ ParseServer API-1
ParseServer是Spine中最核心的业务模块,他面对所有端提供API接口,提供访问控制,推送等服务。
历史上,部署在ParseServer上的APP总数有一百多万,最大的APP有4千多万用户(https://news.ycombinator.com/item?id=13522626)。因此Parse也成为了全球最大的MongoDB用户。
Parse最令人喜爱的,是他优雅的API设计,丰富的SDK以及漂亮的文档。
鉴于最近项目中,遇到的一些前端同学对Parse的API设计有不同的理解,所以这里用几篇文章来介绍一下Parse的API设计和使用。
Parse在数据接口设计的有很强的noBackend风格(nobackend.org)。虽然没有Firebase那么激进,但也为前端工程师提供了非常大的发挥空间。
顺道一张图brief一下noBackend风格。
对于一个前端工程师,这样的代码才是可以大展拳脚的。
下面我们借用Leancloud的一篇优秀的示例教程,来示范一下基于Parse的API的使用。
Leancloud的原文见《基于 AVOS Cloud 的一对多、多对多数据建模》https://blog.leancloud.cn/1723/
假设我们要设计一个类似Instagram的产品,涉及到的数据类型有用户(User),图片(Image),评论(Comment),点赞(Like),他们之间的关系见下图。更详细的描述可见Leancloud的原文。
此图来自Leancloud原文
注:Image中有一个字段是Relation型的likes,用于存储点赞数据。
下面依次介绍前端工程师的接口调用。今天主要涉及了数据的创建,保存,查询和关系查询。
按某个顺序获取所有Image(当然要带分页)
JSSDK版本
// 获得一个针对Image的Query
const Image = Parse.Object.extend("Image");
const query = new Parse.Query(Image);
// 从第0个开始,获取10个
query.limit(10);
query.skip(0);
// 同时获取创建者用户信息
query.include("publisher");
// 按照创建时间倒序
query.descending("createdAt");
// 获得结果
const results = await query.find();
CURL版本
// REST_API_KEY和普通的API_KEY默认是一样的
curl -X GET \
-H "X-Parse-Application-Id: ${APPLICATION_ID}" \
-H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
-G \
--data-urlencode 'limit=10' \
--data-urlencode 'skip=0' \
--data-urlencode 'include=publisher' \
--data-urlencode 'order=-createdAt' \
https://YOUR.PARSE-SERVER.HERE/parse/classes/Image
获得某个Image下面的评论
const Image = Parse.Object.extend("Image");
const query = new Parse.Query(Image);
const image = await query.get("[IMAGE_OBJECTID]");
// comments是image中的一个array类型的属性
const results = await image.get("comments");
CURL版本的就不在发啦,推荐使用Postman来自动生成curl语句。
以某个用户身份发图片
const Image = Parse.Object.extend("Image");
let image = new Image();
image.set("publisher", Parse.User.current()); // 当前登录用户
await image.save();
以某个用户身份对某张图片点赞
这里用到了Relations,是相对比较复杂的部分。可以把Relation想象为针对N-N关联的一个中间表。
// 获取到当前用户
let user = Parse.User.current();
// 当前图片的likes字段
let likes = image.relation("likes");
// 把“我”也加进去
likes.add(user);
await image.save();
FAQ
每次都要Parse.Object.extend吗?
不用,可以复用。
我不想用JS SDK可以吗?
没问题,所有接口是基于RESTful接口的。
http://docs.parseplatform.org/rest/guide/
那是不是前端就可以随便访问数据了?
并不是的,每条数据都有对应的访问控制元信息(ACL)。而且,在后端允许的范围内,前端工程师也可以对自己创建出来的对象设置相应的ACL。