2011-03-09 32 views
2

在我的REST API中創建新資源時,我想讓用戶可以請求一個已經包含一些默認值的空資源。由於它本身沒有ID,我不完全確定我可以使用的RESTful URI。一些想法:可以使用什麼URI來請求默認資源?

http://example.com/resource/_ 
http://example.com/resource/__new 

有關該問題的任何建議或經驗?

回答

1

我認爲這是一個比API更重要的UI事物 - 也就是說,UI應該預先將默認值填充到用戶的各個表單域中,然後用戶將填充空白並自定義默認值值如有必要。這並不適用於任何地方(例如,當您只有一個沒有UI位的API時)。

您已經自己提出了一些選項 - 這些方法可行,但假設您可以訪問現有資源/resource/123,那麼這兩個選項至少會破壞您的URI設計。我可以考慮三種方法來解決這個問題,最後一個(第三個)可能是最好的選擇。

方法#1
一個更好的辦法是,以模仿的方式如何耗時的任務在REST通常完成。通常你有一個資源可以發送一個任務,然後該服務用一個任務URI回覆,你可以稍後使用它來檢查任務的進度。我們可以將它適應於我們的情況 - 使用默認值將空資源定義爲新資源,我們可以使用該資源爲其他資源獲取「模板」。

例子:
假設你想獲得一個名爲「用戶」資源的模板。你會首先做一個POST請求模板資源,並指示要創建一個「模板」資源的類型:

POST /template/ 

<?xml version="1.0" encoding="UTF-8" ?> 
<template> 
    <type>user</type> 
</template> 

的API將創建指定類型的新的「默認」資源在成功的情況下,它會迴應與:

HTTP/1.1 204 No Content 
Location /user/123 

在API的答覆指定的位置,然後將包含該資源的模板:

GET /user/123 

<?xml version="1.0" encoding="UTF-8" ?> 
<user> 
    <id>123</id> 
    <name /> 
    <email /> 
    <preferred-language>en</preferred-language> 
    <timezone>UTC</timezone> 
    ... 
</user> 



方法#2

方法#1已爲您創建資源。另一種方法是允許用戶訪問特定URI上的模板。

例子:

GET /template/user 

<?xml version="1.0" encoding="UTF-8" ?> 
<user> 
    <name /> 
    <email /> 
    <preferred-language>en</preferred-language> 
    <timezone>UTC</timezone> 
    ... 
</user> 



方法3

還有一個選擇 - 我相信這是最簡單,最合乎邏輯的做法,但它可能不適合所有案例。您可以通過直接向您想要使用的資源發送POST請求來創建具有默認值的空資源。一個缺點可能是這不會允許用戶查看模板(他們可以在方法#1中),它總是會爲它們創建一個資源(類似於方法#1)。

例子:
爲了獲取資源的默認版本,你會發送一個空的POST請求到資源:

POST /user/ 

的API將創建一個默認值的新資源和應對用:

HTTP/1.1 204 No Content 
Location /user/123 

相同方法#1中,URI將允許用戶根據需要(通過PUT)獲取創建的資源和然後改變它:

GET /user/123 

<?xml version="1.0" encoding="UTF-8" ?> 
<user> 
    <id>123</id> 
    <name /> 
    <email /> 
    <preferred-language>en</preferred-language> 
    <timezone>UTC</timezone> 
    ... 
</user> 
+0

感謝您的詳細回覆。與默認資源的想法是,我要求它 - 在我的情況下 - 能夠預先填充UI形式。因此,如果用戶決定永不提交該表單(這應該相當於根本不創建資源),那麼創建新資源可能會很困難。 – Daff 2011-03-09 19:20:59

+0

@Daff:我明白了,所以這就打破了方法#1和#3。我過去所做的解決方案提供了默認值作爲UI邏輯的一部分,但這並不理想,特別是如果您想要將UI完全與API分離。 第二種方法適用於這種情況,我認爲它比使用'/ resource/_new'更爲RESTful,因爲模板本身也是一種資源。然而,通過將其定義爲一個新資源,可以將其與原來的資源(作爲模板的資源)分開,這可能並不總是可取的(例如從URI結構的角度來看)。 – MicE 2011-03-10 09:18:47