REST:使用Controller端点?
在一般的REST架構(gòu)中,基本概念是資源。 在資源之后,下一步是為這些資源開發(fā)一個(gè)統(tǒng)一接口,這在HTTP領(lǐng)域通常意味著:
- 創(chuàng)建為POST
- 閱讀就是GET
- 更新為PUT(或部分更新為PATCH)
- 刪除已刪除
在現(xiàn)實(shí)世界中,不可避免地某些操作不會(huì)很好地映射到資源。 通常這是少數(shù)操作,例如重置密碼。 可以將它們建模為
- / password /上的PUT
或作為
- 控制器端點(diǎn)和到/ resetpassword的POST
后者可能被認(rèn)為比純REST更接近于程序化REST,但是有時(shí)客戶和客戶希望您務(wù)實(shí)。 本文提供了有關(guān)何時(shí)考慮使用Controller選項(xiàng)的建議。
動(dòng)作是否映射到CRUD?
現(xiàn)實(shí)應(yīng)用程序中的幾個(gè)動(dòng)作無(wú)法很好地映射到CRUD。 例如,貝寶的取消計(jì)費(fèi)協(xié)議API是:
POST /v1/payments/billing-agreements/agreement_id/cancel取消動(dòng)作很少能很好地映射到資源的CRUD。 它可以解釋為:
- 一些資源被創(chuàng)建(取消記錄)
- 一些資源被更新(某些狀態(tài)列可能被設(shè)置為取消)
- 或某些資源被刪除(訂單請(qǐng)求被刪除)。
客戶為什么要關(guān)心取消的處理方式? 難道它總是會(huì)改變嗎? 在某些情況下,使用HTTP隧道的API不能很好地映射到CRUD問(wèn)題。 在取消帳單協(xié)議中,這將是:
POST /v1/payments/billing-agreements/agreement_id與身體:
{"operation":"cancel" }這被認(rèn)為是反模式,決不能使用。 而是應(yīng)使用控制器端點(diǎn)。
資源狀態(tài)或工作流程?
在REST體系結(jié)構(gòu)中,客戶端或服務(wù)器之間的每個(gè)請(qǐng)求通常都會(huì)更改資源狀態(tài)(寫操作)或應(yīng)用程序狀態(tài)(查詢或讀操作)。 但是,在現(xiàn)實(shí)世界中,工作流是不可避免的。 例如,重置密碼流程通常包括:
- 向用戶詢問(wèn)userId(通常是電子郵件)
- 系統(tǒng)檢查系統(tǒng)上是否存在電子郵件
- 向用戶發(fā)送包含重置密碼鏈接的電子郵件
- 確保用戶只有一定時(shí)間才能單擊鏈接
- 當(dāng)用戶單擊鏈接時(shí),他們可能會(huì)被問(wèn)到一系列問(wèn)題
- 他們將被要求重新輸入新密碼,以確保沒(méi)有錯(cuò)字
當(dāng)客戶端操作是復(fù)雜工作流的一部分時(shí),資源狀態(tài)和應(yīng)用程序狀態(tài)更改可能不容易建模。 它們可能不會(huì)同步發(fā)生,并且可能會(huì)根據(jù)工作流的建模方式或工作流何時(shí)需要添加額外的步驟進(jìn)行更改。 在這種情況下,請(qǐng)考慮使用控制器端點(diǎn)。
無(wú)需PUT的REST
在某些情況下,可以設(shè)置參數(shù)以避免使用PUT,而可以使用POST到另一個(gè)表示意圖的端點(diǎn)。 例如,要更改地址而不是將PUT調(diào)用到/ address /,客戶端將調(diào)用POST到/ changeaddress并完全避免使用PUT。 這里的想法是使命令/查詢分離更嚴(yán)格。 有關(guān)更多信息,請(qǐng)參見https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling。 通常,建議使用PUT / PATCH進(jìn)行更新/部分更新,并且僅在前兩個(gè)原因之一適用時(shí)才使用控制器端點(diǎn)。
那么,為什么何時(shí)使用控制器樣式終結(jié)點(diǎn)可能涉及主觀性。 以上至少可以幫助您做出決定。 請(qǐng)記住,在您考慮采用這種方法的情況下,它應(yīng)該永遠(yuǎn)只是少數(shù)API。 您在常規(guī)的Uniform Interface之外,無(wú)法進(jìn)行獨(dú)特的樣式操作,但是您仍然希望使它們對(duì)API的客戶來(lái)說(shuō)很直觀。
翻譯自: https://www.javacodegeeks.com/2018/05/rest-using-a-controller-endpoint.html
總結(jié)
以上是生活随笔為你收集整理的REST:使用Controller端点?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java设计模式迭代器模式_Java中的
- 下一篇: 吊牌打印机(吊牌打印机什么牌子好)