GraphQL 大家都知道,但是 DOF 的 GraphQLAlike 是指目标和 GraphQL 类似,但是形式却和 GraphQL 不同的一种另一种更简单的解决方案。

说明:本 Pipe 默认并未启用,因此项目中需要手动配置,推荐配置到全局领域配置 http.port.pipeout 中。

接口数据模型

DOF 的每个 HTTP 接口都会显式或隐式地关联某个数据模型,每个数据模型都有一系列属性,这些属性是就是可以被客户端按需返回的字段。

参数字段名

如果没有特殊说明,均固定为 __fields。返回的数据本身就会自动组装成和 __fields 指定的参数列表结构。

IFRSN

GraphQLAlike Pipe 内部使用了 IFRSN(Input Fields Relation Structured Notation) 来描述字段及其结构,但在使用上又简化了一些。

实例

假设接口关联了用户实体 (User.Entity.User) 作为其数据模型,用户实体拥有属性如下:

属性 类型 说明 可接受参数
name String 姓名 -
mobile String 手机号 -
creator Entity 用户创建人 - User.Entity.User -
createdAt Uint 注册时间 {"0":{"tpl":"Y-m-d H:i:s","demo":"2018-12-16 19:05:44"},"1":{"tpl":"y/m/d H:i:s","demo":"18/12/16 19:05:44"},"2":{"tmp":"d/m/y H:i:s","demo":"16/12/2018 19:05:44"},"default":"1"}

则:

  • 获取某个用户的姓名和手机号
GET /v1/users/1?__fields=name,mobile

{
    "name": "xxxx",
    "mobile": "133xxxx3333"
}
  • 获取某个用户的手机号码和注册时间,并按自定义格式显式
GET /v1/users/1?__fields=mobile,createdAt{format:0}

{
    "mobile": "133xxxx3333",
    "createdAt": '2019-01-01 10:10:10'
}

可以看到,这里的字段 createdAt 还跟了一个字段参数 {format:0},这个字段参数表示将从用户实体的 createdAt 属性中的可接受参数中去查找对应的数据格式编号为 0 的格式并应用到注册时间的格式显式。

  • 获取用户的创建人信息
GET /v1/users/1?__fields=name,mobile,creator(name)

{
    "name": "xxxx",
    "mobile": "133xxxx3333",
    "creator": {
        "name": "yyyy",
    } 
}

注意事项

  • 当字段的类型为实体列表(ListArrayOfReference)时,且需求为递归查找时,那么作为参数传到请求的该字段一定要包括 (),而 () 中的字段可以一个都不要。

在类似无限分类的应用场景中,我们可以只通过 __fields 语法实现,而无需改造我们 Service 组装逻辑或者 Storage 的查询逻辑。比如:

GET /v1/categories/1?__fields=children(),id,title

{
    "id": 1,
    "title": "cate-1",
    "children": [
        {
            "id": 2,
            "title": "cate-2",
            "children": [
                {
                    "id": 3,
                    "title": "cate-3",
                    "children": null
                }
            ]
        }
    ] 
}

results matching ""

    No results matching ""