2014-03-31 46 views
0

我知道一個衆所周知的問題在這裏:PUT vs POST in REST選擇在REST創建多個資源

不過我有點在我的情況的一個困惑,希望尋求提醒正確設計我的REST風格的WS:

假設我的系統的工作是這樣的:

我的系統定義了多個批處理作業(如JOB1JOB2)。

每一天,我會要求我的系統創建批處理作業計劃的列表,通過提供特定日期(例如,我通過了情節中字,則系統會JOB1(2014-12-25)JOB2(2014-12-25)

用戶可以觸發一個批處理作業計劃執行

我想尋求提醒適當的揭露這些爲資源:

我應該做一個POST或PUT到資源/batchSchedules觸發了創作的batchSchedules具體的日期?URL應該如何看起來像mak它是一個適當的RESTful API?

「計劃觸發」應該是什麼樣子?

我想這兩種選擇的,但兩者並不聽起來很正確的對我說:


方法1:

要爲特定日期創建時間表:PUT/batchSchedules/2014-12-25空請求正文,因爲我似乎正在創建「一堆日程表」作爲在URL中聲明的資源。(然而,它似乎是對的,因爲如果我再次調用它,看起來不太好,我不打算替換它)

要觸發計劃執行:PUT/batchSchedules/2014-12-25/JOB1,因爲它似乎取代了批處理計劃資源GET/batchSchedules/2014-12-25/JOB1

要獲得計劃的狀態與有意義的輸入(但它看起來很奇怪怎麼我我沒有真正更換的資源,不能因爲我其實不是生成URL以下的兒童的資源在這裏乘坐POST)

要獲得計劃的狀態:GET/batchSchedules?id=12345其中12345是一個時間表


方法2 ID: 要創建一個特定的日期安排:POST/batchSchedules帶日期的請求主體,因爲它似乎是我創建批處理調度的子資源

要觸發一個時間表執行:PUT/batchSchedules/2014-12-25/JOB1,因爲它似乎取代了批處理調度資源(但它看起來很奇怪,因爲我實際上並不真正替換資源,因爲我實際上並沒有在URL下面生成一個子資源)

要使用有意義輸入得到一個時間表的狀態:GET/batchSchedules/2014-12-25/JOB1

爲了得到一個時間表的狀態:GET/batchSchedules?id=12345這12345爲時間表ID


方法3:

要獲得具有有意義輸入的時間表狀態:GET/batchSchedules?job=JOB1&date=2014-12-25

要獲得時間表的狀態:GET/batchSchedules/12345其中12345是一個時間表

要爲特定日期創建時間表ID:POST/batchSchedules帶日期的請求主體,因爲它似乎是我創造/batchSchedules下一堆批處理調度的子資源(沒有按「T似乎相當不錯)

要觸發計劃執行:PUTPOST/batchSchedules?job=JOB1&date=2014-12-25,因爲它似乎取代了一批資源調度(看起來真的很奇怪,我)


其中哪些是以適當的REST方式公開我的WS的適當方式?

回答

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,具有Location請求頭的URI批量結果一起,像/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

+0

感謝您的回覆,我會盡力進一步閱讀。只是一件事:我想避免使用GET來創建這些「日程安排」,因爲我希望創建是明確的,並且GET/schedule/DATE應該爲我提供特定日期的日程安排(即以前創建的日程安排)。如果這是我的設計決策,我應該如何以REST方式公開它?我相信我對工作時間表的想法更像是你的「時間表執行」:我的「時間表」是一項計劃在特定日期執行的工作。 –

+0

那麼,如果你決定使用PUT/POST,那麼它就是客戶所擁有的信息。如果客戶可以*完全*指定時間表,那麼PUT是適當的。如果有什麼信息可以改變客戶端沒有的信息,你*必須*使用POST。 –