2012-02-27 20 views
3

我正在構建測驗。用戶可以選擇一個主題並回答5個問題。每個問題後,他們都會看到答案。我試圖堅持嚴格的RESTful表示這個工作流程,但無法真正解決一個URL方案。例如:REST風格的測驗表示

用戶喬挑選主題運動並準備好看到第一個問題。網址是

user/joe/subject/sport/question/1 

當他提出他的回答「B」(其選擇題測驗),喬正在創造一個新的答案,我們發佈到

user/joe/subject/sport/question/1/answer/B 

查看正確答案之前
user/joe/subject/sport/answer/1 

,我們再在

user/joe/subject/sport/question/2 
查看下一個問題

這顯然太複雜了。你如何以REST風格處理這個問題?

回答

1

開始this presentation 。這對於RESTful API設計來說是一個很好的資源。考慮到這一點,以下是一些開始建議:

  1. REST式URL具有隱式層次結構。從URL中取出用戶信息。它屬於HTTP標頭。

    /subject/sport/question/1 
    /subject/sport/question/1/answer/B 
    /subject/sport/answer/1 
    /subject/sport/question/2 
    
  2. 我沒有看到由subject部分添加任何有用的信息。 subject由(在你的例子中)sport標識。

    /sport/question/1 
    /sport/question/1/answer/B 
    /sport/answer/1 
    /sport/question/2 
    
  3. 分類應該是複數。

    /sports/questions/1 
    /sports/questions/1/answers/B 
    /sports/answers/1 
    /sports/questions/2 
    
  4. 當您發佈回答一個問題,你不張貼到添加一個新的答案資源(也就是定義一個新的可能的答案)。你不是在發佈到現有資源嗎?

  5. 您還沒有提及任何關於HATEOAS的內容。如果你真的要實現REST,你應該做這樣的事情providing "next" links in the hypermedia.

+0

MДΓΓ,你能澄清點4嗎?這很有道理,但是你會發布什麼資源? – jdee 2012-02-27 23:09:06

+0

我不確定,這就是爲什麼我沒有太過分。也許像'POST/sports/answers?question = 1'? – 2012-02-27 23:19:31

0

我會從路線中完全刪除/user/joe。您可以使用Devise,Authlogic或其他身份驗證框架來獲取current_user。

否則這對我來說看起來不錯,因爲它只有兩個足夠可讀的巢穴。所以你會有:

GET subjects/sports/questions/1 
POST subjects/sports/questions/1 # pass along params with {:answer => 'B'} 
GET subjects/sports/answers/1 
1

對我來說,REST服務的基本思想是「資源」。首先你需要確定你的資源。

所以有一個用戶,她開始一個新的測驗。

  • POST/user/joe/quiz。
  • 它返回:位置:/用戶/喬/測驗/ 1

然後,用戶選擇一個體育問題,讓你更新你的測驗,包括隨機的(服務器選擇)的問題。

  • POST /用戶/喬/測驗/ 1 - >主題:運動
  • 它返回:位置:/用戶/喬/測驗/ 1 /問題/ 1

用戶回答:

  • PUT /用戶/喬/測驗/ 1 /問題/ 1 - >答案乙

立即沖洗和重複。

的資源,我們已經有了:

  • 用戶
  • 測驗爲用戶
  • 測驗中的問題(問題與答案更新)
+0

應該PUT操作冪等。我不確定回答問題是。 – 2012-02-27 22:40:25

+0

我使用POST創建和PUT更新(http://stackoverflow.com/questions/630453/put-vs-post-in-rest) – graffic 2012-02-27 22:44:22