為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2019-09 文章編輯:小燈 瀏覽次數(shù):4246
RESTful?是目前最流行的 API 設(shè)計(jì)規(guī)范,也是各公司招聘面試的項(xiàng)目之一。很多人對(duì) RESTful API 的設(shè)計(jì)還不是很規(guī)范,于是便有了本文。
URL 的設(shè)計(jì),一般我們會(huì)采用:動(dòng)詞 + 賓語(yǔ)的形式表示。
RESTful 的核心思想就是,客戶(hù)端發(fā)出的數(shù)據(jù)操作指令都是"動(dòng)詞 + 賓語(yǔ)"的結(jié)構(gòu)。比如,GET /articles這個(gè)命令,GET是動(dòng)詞,/articles是賓語(yǔ)。
動(dòng)詞通常就是五種 HTTP 方法,對(duì)應(yīng) CRUD 操作。
根據(jù) HTTP 規(guī)范,動(dòng)詞一律大寫(xiě)。
有些客戶(hù)端只能使用GET和POST這兩種方法。服務(wù)器必須接受POST模擬其他三個(gè)方法(PUT、PATCH、DELETE)。
這時(shí),客戶(hù)端發(fā)出的 HTTP 請(qǐng)求,要加上X-HTTP-Method-Override屬性,告訴服務(wù)器應(yīng)該使用哪一個(gè)動(dòng)詞,覆蓋POST方法。
POST /api/Person/4 HTTP/1.1X-HTTP-Method-Override: PUT
上面代碼中,X-HTTP-Method-Override指定本次請(qǐng)求的方法是PUT,而不是POST。
在 SpringMVC 中會(huì)添加一個(gè)?HiddenHttpMethodFilter 過(guò)濾器。它會(huì)將表單上隱藏域_method屬性改為put或者delete等再進(jìn)行提交。因?yàn)橹挥衒orm表單才具有post方法,而這個(gè)過(guò)濾器也只能將post方法轉(zhuǎn)化,get則不行。不懂的可以看這篇文章:https://blog.csdn.net/jaryle/article/details/73656426。
賓語(yǔ)就是 API 的 URL,是 HTTP 動(dòng)詞作用的對(duì)象。它應(yīng)該是名詞,不能是動(dòng)詞。比如,/articles這個(gè) URL 就是正確的,而下面的 URL 不是名詞,所以都是錯(cuò)誤的。
既然 URL 是名詞,那么應(yīng)該使用復(fù)數(shù),還是單數(shù)?
這沒(méi)有統(tǒng)一的規(guī)定,但是常見(jiàn)的操作是讀取一個(gè)集合,比如GET /articles(讀取所有文章),這里明顯應(yīng)該是復(fù)數(shù)。
為了統(tǒng)一起見(jiàn),建議都使用復(fù)數(shù) URL,比如GET /articles/2要好于GET /article/2。
常見(jiàn)的情況是,資源需要多級(jí)分類(lèi),因此很容易寫(xiě)出多級(jí)的 URL,比如獲取某個(gè)作者的某一類(lèi)文章。
GET /authors/12/categories/2
這種 URL 不利于擴(kuò)展,語(yǔ)義也不明確,往往要想一會(huì),才能明白含義。
更好的做法是,除了第一級(jí),其他級(jí)別都用查詢(xún)字符串表達(dá)。
GET /authors/12?categories=2
下面是另一個(gè)例子,查詢(xún)已發(fā)布的文章。你可能會(huì)設(shè)計(jì)成下面的 URL。
GET /articles/published
查詢(xún)字符串的寫(xiě)法明顯更好。
GET /articles?published=true
RESTful API 最好的例子就是 github 網(wǎng)站。大家經(jīng)常使用,一定不陌生。所以可以借鑒 github 上的資源命名方式來(lái)開(kāi)發(fā)自己的產(chǎn)品,設(shè)計(jì)自己的?RESTful API 和 URL。