2017-03-06 58 views
0

我對RESTful Web API最佳實踐有一些疑問。如果我的web API不是簡單的CRUD,該怎麼辦?

看起來標準是使用HTTP協議,如GETPUTPOST來簡化接口。

GET /票 - 獲取門票的列表
GET /票/ 12 - 檢索特定票
POST /票 - 創建一個新的票
PUT /票/ 12 - 更新票#12
PATCH /票/ 12 - 部分更新票#12
DELETE /票/ 12 - 刪除票#12

但花費在開發我的第一個API後,我真的不覺得它屬於我nto這樣一個整潔的設計。

我的API支持添加或更新LineItem s,並且呼叫者可以一次添加或更新這些LineItem中的任意數量。另外,他們可以確認或取消任何號碼。在添加和更新的情況下,還提供了許多其他相關數據。爲了確認或取消,需要更少的數據。

那麼這怎麼符合上述的票據界面?我是否創建了糟糕的Web API?公認的標準是否允許其他變化?討論這個問題的任何好的鏈接?

+0

POST /票/ 12 /線 - 。創造條件,票新行12 – benPearce

+0

你現在應該可能知道,要求鏈接是脫離主題... –

回答

1

您可以在一個類上執行比整個對象上的CRUD任務更具體的任務的方法。因此,假設您的Ticket對象也有行項目,你可能有一個認沽認購URI,如:?

PUT /票/ 12/LineItem的名稱= BLAH &地址= FOO

在代碼的方法將那麼就像

public class TicketController 
{ 
    [HttpPut] 
    [ActionName("LineItem")] 
    public HttpResponseMessage UpdateLineItem(int id, string name, string address) 
    { 
     // Do stuff here. 
    } 
} 

很明顯,你會把你的其他方法放在那裏。您可能需要修改它,以便您的訂單項信息通過PUT或POST主體而不是通過URI進入,但是顯示URI參數的工作方式也很有用。

但是,如果LineItem S IN的問題相關Ticket S,那麼你應該找一些其他的控制器,把他們在

+0

你能澄清爲什麼你在這裏使用'ActionName'屬性而不是僅僅命名行爲'LineItem()'?謝謝。 –

+0

要麼應該工作。這歸結於開發人員的偏好,以及您的團隊與編碼/網絡API標準的緊密關係。只要每個人都明白PUT == Update,你就沒事了,沒有理由把它放在方法名中。但即使如此,如果您使用Code Lens或其他工具來查找LineItem方法,那麼在進入課程之前您不會看到[HttpPut]裝飾。更新只是讓這個方法更清楚一點。不相關的,你應該包含票據ID per @ benPearce的評論。我會修改我的答案來證明這一點。 – Necoras

相關問題