2016-08-31 75 views
4

本質上,我發現在這個話題上有很多意見,但沒有一個讓我相信什麼是正確的。更具體地講,我有以下問題:什麼是WebAPI2中正確的RESTful實現?

單數還是複數或兩者

  • 是否有甚至一個正確的和錯誤的方式?

    標準和慣例存在的原因,我不相信我永遠不會滿足 - 這只是一個品味問題。沒有任何指導原則或標準嗎?沒有權限完成Fieldings的工作?

什麼IHttpActionResults返回?他們應該包含什麼?

  • Get - return Ok();
  • Post - return Created();
  • 說 - 回報(放好吧?)
  • 刪除 - 回報(刪除好吧?)

什麼中創建(位置)返回?

假設控制器路由 'API/V1 /模型',它應該是

我問這些問題是因爲我經常遇到關於如何最好地實現API的衝突。

+1

+1這是一個很好的問題。當你說「假設控制器路由是'api/v1/model'時,你能詳細說明你的意思嗎?它應該是」.. etc控制器路由從域(www.mywebapi.com/)開始,所以有什麼區別選項nr 2和nr 3之間? –

+0

'Created()'方法中的'location'參數應該是對當前_item_權限的引用?我認爲2和3之間的區別應該是顯而易見的。 #2將假定API消費者本身將爲URL的正確部分提供,#3 - 將返回完整和完整的URL。據我所知,'location'參數只是一個純字符串,並沒有_「。NET-auto-complete-route-to-url-conversion-thingie」。 – Marcus

+0

好吧,現在我明白了。當你閱讀這個問題時,「Created(location)」行代表它自己。您應該刪除換行符或重寫它們。好問題,但如果API是從不同的域消耗,那麼我會返回完整的URL。 –

回答

2

問:單數還是複數或兩者

千萬不要同時使用。使用任一個。使用名詞而不是動詞。

不要使用動詞:

/getAllCars
/createNewCar
/deleteAllRedCars

不要混淆了單數和複數名詞。保持簡單,只爲所有資源使用複數名詞。

/cars instead of /car 
/users instead of /user 
/products instead of /product 

現在,如果你看到下面,它會更有意義:

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

如果一個資源與另一個資源使用子資源有關。

GET /車/ 711 /驅動器/返回車的驅動程序列表711

問:什麼中創建(位置)返回?

200 OK - 響應成功的GET,PUT,PATCH或DELETE。也可以用於不會導致創建的POST。

201創建 - 響應導致創建的POST。應與指向新資源位置的​​結合使用

提供最後一個問題的清晰度,我會相應地更新我的答案。

REST沒有定義的標準,每個人都根據自己的需要使用最佳實踐。不過,我建議你通過apigee.com上的這個PDF,列出REST API的最佳實踐以及Facebook,Twitter等各大玩家的用途。

+0

'location'是絕對網址還是左邊部分?客戶應該期待「location」是什麼? – Marcus

+0

另一個問題是,並不總是清楚關係(以及因此路線應該如何工作),考慮多對多關係......其中'api/accounts/{id}/user'可以是一種選擇,但也是'api/users/{id}/accounts'這會在**語義上引導我們進入一個無限循環,這將是適當的api/accounts/{id}/user/accounts/{id}/user/accounts/{ID} [..]'。 – Marcus

+1

如果你在我的文章中提到位置標題鏈接,它會說絕對URI。 –

相關問題