我希望有一个根据多个模式进行验证的端点。我读过文档和一些伊芙的代码,但我不清楚这是否可能。下面是一个简单的例子,说明我想做什么:

POST http://eve-server/vehicles/
{
    type: 'Boat',
    manufacturer: 'Seadoo',
    propeller_size: 2.0
}

POST http://eve-server/vehicles/
{
    type: 'Airplane',
    manufacturer: 'Boeing',
    wing_span: 195.8
}

GET http://eve-server/vehicles/

[
    {type: 'Boat', manufacturer: 'Seadoo', propeller_size: 2.0},
    {type: 'Airplane', manufacturer: 'Boeing', wing_span: 195.8}
]

Eve/Cerberus支持像这样的多态类型吗?如果没有,是否可以插入类似JSON模式的东西来支持它,同时保持data_relation提供的引用完整性?

最佳答案

嗯,我不太明白你的问题。乍一看,我认为这正是普通API端点的行为方式。我假设propeller_sizewing_span是可选字段。您可以一次发布一个文档,如示例中所示:

POST http://eve-server/vehicles/
{
    type: 'Boat',
    manufacturer: 'Seadoo',
    propeller_size: 2.0
}

POST http://eve-server/vehicles/
{
    type: 'Airplane',
    manufacturer: 'Boeing',
    wing_span: 195.8
}

或者可以发布文档列表:
POST http://eve-server/vehicles/
[
    {type: 'Boat', manufacturer: 'Seadoo', propeller_size: 2.0},
    {type: 'Airplane', manufacturer: 'Boeing', wing_span: 195.8}
]

在这两种情况下,当您到达同一个端点时,您将获得可用文档的列表:
GET http://eve-server/vehicles/
{
    "_items": [
        {type: 'Boat', manufacturer: 'Seadoo', propeller_size: 2.0},
        {type: 'Airplane', manufacturer: 'Boeing', wing_span: 195.8}
    ]
    "_meta": {
        "total": 259,
        "page": 1,
        "size": 25
    }
}

假设HATEOAS已经被禁用,否则你也会得到一个_links元字段。
也就是说,请记住,您可以设置multiple endpoints all targeting the same datasource,这样您就可以有一个具有自己的模式和验证的POST-only端点,也可以有一个具有不同模式的GET-only端点,这可能是因为在这个端点上,您返回的字段是通过mongo、事件挂钩(回调)或其他API端点添加的。

09-20 10:40