REST中的动作链接将基于现有资源创建资源

时间:2014-06-24 22:55:48

标签: rest hateoas

我正在努力将动作链接到我的资源以实现HATEOAS。

我想基于现有资源创建新资源,并且仍然实现完善的超媒体策略。在我的例子中,在通用服务器端作业队列上追加现有的测试请求。

我执行此操作的当前流程(为简化起见而简化)不使用超媒体来链接实际排队test_request的操作(在作业集合上创建作业资源)。

创建test_request资源

POST http://example.org/api/v1/test_request

{
    'name': 'Some example tests',
    'test': 'test1'
}


201, CREATED

{
    'id': 3
    'name': 'Some example tests',
    'test': 'test1',
    'links': [
        {
            'rel': 'self',
            'href': 'http://example.org/api/v1/test_request/3',
            'method': 'GET',
        },
        {
            'rel': 'remove',
            'href': 'http://example.org/api/v1/test_request/3',
            'method': 'DELETE',
        }]
}

生成职位资源

POST http://example.org/api/v1/jobs

{
    'type': 'test_request',
    'id': 3
}


201, CREATED

{
    'id': 12,
    'type': 'test_request',
    'status': 'new',
    'links': [
        {
            'rel': 'self',
            'href': 'http://example.org/api/v1/jobs/12',
            'method': 'GET',
        },
        {
            'rel': 'remove',
            'href': 'http://example.org/api/v1/jobs/12',
            'method': 'DELETE',
        }]
}

要在我的REST API上实现超媒体标准,我真的很想在test_request资源上添加一个操作链接,以便为它创建一个新的作业资源。

修改了test_request表示

{
    'id': 3
    'name': 'Some example tests',
    'test': 'test1',
    'links': [
        {
            'rel': 'self',
            'href': 'http://example.org/api/v1/test_request/3',
            'method': 'GET',
        },
        {
            'rel': 'remove',
            'href': 'http://example.org/api/v1/test_request/3',
            'method': 'DELETE',
        },
        {
            'rel': 'http://example.org/rels/queue',
            'href': 'http://example.org/api/v1/test_request/3/queue',
            'method': 'PUT',
        }]
}

所以,第一个例子是(希望)RESTful是我的第二个方法,队列动作可能更不可靠。但是,在test_request表示中有一个明确说明要进行下一次转换的动作的链接真的很不错。

这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

你的问题不是很清楚,所以我会解释你所提出的问题,也许这有助于得到答案。

根问题是一个域名问题,只有你才能真正回答。可以而且应该在不参加工作的情况下进行测试吗?您需要仔细考虑用例并做出决定。如果测试是一个弱实体,那么你应该只允许通过工作创建。

关于您对RESTful架构的努力。我建议从API中删除id字段的概念。自我链接是ID。创建作业时,您可以提供要包含在作业中的测试的链接集合。像

这样的东西
POST http://example.org/api/v1/jobs

{
    'type': 'test_request',
    'links': [
       {
         rel : "test",
         href : "http://example.org/api/v1/test_request/3",
       },
       {
         rel : "test",
         href : "http://example.org/api/v1/test_request/4",
       }
     ]
}

注意:我不确定你的超文本格式如何处理同一关系的多个链接...我猜了。

我认为主键和外键不应该存在于RESTful API中。应始终使用链接。