[给创业公司的原生云] ⑥ 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。