在REST中选择PUT / POST以创建多个资源

时间:2014-03-31 10:38:21

标签: rest

我知道这里有一个众所周知的问题:PUT vs POST in REST

但是在我的一个案例中我有点困惑,并且想要寻求正确设计我的RESTful WS的建议:

假设我的系统工作如下:

我的系统将定义多个批处理作业(例如JOB1JOB2)。

对于每一天,我会要求我的系统通过提供特定日期来创建批处理作业计划列表(例如,我在2014-12-25通过,然后系统将创建JOB1(2014-12-25)和{{1 }}

用户可以触发批处理作业计划执行。

我想寻求建议将这些作为资源公开:

我应该对资源JOB2(2014-12-25)进行POST或PUT以触发特定日期/batchSchedules的创建吗? URL应如何使其成为正确的RESTful API?

"计划触发"看起来像?

我正在考虑这两种选择,但两种听起来都不对我说:


方法1:

要为特定日期创建日程安排:batchSchedulesPUT,请求空身体,因为我似乎在创建"一堆日程安排"作为URL中声明的资源。 (但是,这似乎是正确的,因为如果我再次打电话,我不打算替换它,这看起来不太好)

要触发计划执行:/batchSchedules/2014-12-25PUT,因为它似乎取代了批处理计划资源(但它看起来很奇怪因为我没有真正替换资源,因为我不能在这里接受POST实际上没有在URL下面生成子资源)

要获得有意义输入的计划状态:/batchSchedules/2014-12-25/JOB1 GET

要获取时间表的状态:/batchSchedules/2014-12-25/JOB1 GET其中12345是时间表的ID


方法2: 要创建特定日期的日程安排:/batchSchedules?id=12345POST,请求正文中包含日期,因为我似乎正在创建批处理计划的子资源

要触发计划执行:/batchSchedulesPUT,因为它似乎取代了批处理计划资源(但它看起来很奇怪因为我没有真正替换资源,因为我不能在这里接受POST实际上没有在URL下面生成子资源)

要获得有意义输入的计划状态:/batchSchedules/2014-12-25/JOB1 GET

要获取时间表的状态:/batchSchedules/2014-12-25/JOB1 GET其中12345是时间表的ID


方法3:

要获得有意义输入的计划状态:/batchSchedules?id=12345 GET

要获取时间表的状态:/batchSchedules?job=JOB1&date=2014-12-25 GET其中12345是时间表的ID

要创建特定日期的时间表:/batchSchedules/12345POST,请求正文中包含日期,因为我似乎在/batchSchedules下创建了一批批量计划的子资源(并不是很好)

要触发计划执行:/batchSchedulesPUTPOST,因为它似乎取代了批处理计划资源(看起来对我来说很奇怪)


哪种方式是以适当的REST方式公开我的WS的合适方式?

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读您的问题,客户除了提供日程安排之外,还不提供任何信息。如果这是真的,我会争辩你应该使用GET,而不是PUT或POST。从概念上讲,客户端没有理由做任何事情来创建资源 - 它都在服务器端。所有客户都知道"我想要第X天的批量作业时间表"。服务器是否需要创建新计划或检索现有计划并不是客户需要关注的事情。

GET /batchSchedules?date=2014-12-25
{
    "id": 12345,
    "self": "/batchSchedules/12345",
    "jobs": [{
            "id": 67890,
            ...
        },
        ...
    ]
}

POST /scheduledExecutions
{
    "scheduleId": 12345,
    "date": "2014-12-25"
}

如果批量立即完成,则帖子的响应可以是200 OK,或者更可能是202 Accepted,以及批量结果的URI的Location请求标头,像/scheduledExecutions/67890。在该URI上调用GET将返回批次的状态信息,可能包括批次中各种作业状态的URI。

GET /scheduledExecutions/67890
{
    "status": "In progress",
    "date": "2014-12-25",
    "jobs": [{
        "id": 13579,
        "status": "Complete",
        "self": "/scheduledJobs/13579"
    },
    {
        "id": 24680,
        "status": "In progress",
        "self": "/scheduledJobs/24680"
    }
}

如果我误解了,并且您正在执行工作,而不是整个时间表,那么您就拥有POST /scheduledJobsGET /scheduledJobs而不是/scheduledExecutions