請君入坑:RESTFul設(shè)計(jì)風(fēng)格(一)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ①

有一次面試,面試官問:“什么是REST風(fēng)格肥卡?”

自己也是剛接觸這一個(gè)概念溪掀,并沒有系統(tǒng)化的去學(xué)習(xí),就含含糊糊地回答:“前臺用GET請求步鉴,后臺也用GET接收揪胃;前臺用POST請求,后臺也用POST接收……”

還沒等我說完氛琢,就被面試官就打斷:“前臺用GET請求喊递,后臺用POST接收,能接收到嗎阳似?”

“額骚勘,不能〈樽啵”

“你們項(xiàng)目里用過嗎俏讹?”

“用過的⌒蟮酰”

“有接口文檔嗎泽疆?”

“有”

“接口是怎么命名的?”

當(dāng)時(shí)玲献,傻了眼于微,不知道該怎么描述,是動(dòng)詞名詞相結(jié)合嗎青自,駝峰式的命名法株依?支支吾吾了半天……更不知道面試官葫蘆里裝的什么藥,這樣問的目的是什么延窜,心里的幾只小兔子一直蹦呀跳呀恋腕,不敢輕易回答,忐忑逆瑞。

就這樣荠藤,在這場面試中伙单,灰不溜秋的敗下陣來。

回到家中哈肖,立刻翻書查資料吻育,終于明白了面試官為何這樣問。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ②?

請看這段代碼:?

@RestController

public class TestController {

????????? @RequestMapping("/test")

????????? public Object test(){

? ? ? ? ? ? ? ? return "test";

????????? }

}?

如果僅僅在Controller類上加上@RestController淤井,有了Rest字樣布疼,就認(rèn)為已經(jīng)實(shí)現(xiàn)了REST風(fēng)格,那也是大錯(cuò)特錯(cuò)了币狠,這只是RESTFul風(fēng)格的冰山一角喲游两。當(dāng)然,自己也曾經(jīng)這么傻傻地認(rèn)為漩绵。

先來說說這個(gè)@RestController的作用吧,?

@RestController = @Controller + @ResponseBody宝踪,沒錯(cuò)上面的代碼等同于下面的代碼:?

@Controller

public class TestController { ? ? ? ? ?

????????? @ResponseBody

????????? @RequestMapping("/test")

????????? public Object test(){

? ? ? ? ? ? ?? return "test";

????????? }

}

為什么等同呢蕴忆,一看運(yùn)行結(jié)果,二看源碼,請看@ResponseBody的源碼,源碼最有說服力:

圖-1


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ③

那到底什么是RESTFul風(fēng)格呢?看官方解釋巷挥,REST是英文Representational State Transfer的簡稱,可以翻譯為表現(xiàn)層狀態(tài)轉(zhuǎn)換。它是一種軟件架構(gòu)風(fēng)格,在兩千年的時(shí)候排作,這種思想提出了楞件,如今發(fā)展也快十個(gè)年頭了罪针,具體的可以自己網(wǎng)上搜还最,個(gè)人推薦阮一峰的網(wǎng)絡(luò)日志:http://www.ruanyifeng.com/blog/2011/09/restful.html

下面上代碼,進(jìn)入使用階段,下面的這四種是比較常用的,還有PATCH(UPDATE)、HEAD种蝶、OPTIONS這三種不常用盯滚,就不列舉了酗电。

/**

?* RESTFul風(fēng)格代碼示范

?* @author ME

?*

?*/

@RequestMapping("/user")

@RestController

public class UserController {

????????? /**

????????? ?* 新增(CREATE)

????????? ?* @param user

????????? ?* @return

????????? ?*/

??? @RequestMapping(value="/save",method= RequestMethod.POST)

??? public? Object save(User user) {

??? ????? System.out.println("數(shù)據(jù)庫持久層操作");

??? ????? returnuser.getUserMobile();

??? }

? ? /**

???? * 修改(UPDATE)

???? * @param userUid

???? * @param user

???? * @return

???? */

??? @RequestMapping(value="/{userUid}",method= RequestMethod.PUT)

??? public Object update(@PathVariableInteger userUid,User user) {

??? ????? System.out.println("數(shù)據(jù)庫持久層操作");

??? ????? returnuserUid;

??? }

??? /**

???? * 刪除數(shù)據(jù)(DELETE)

???? * @param userUid

???? * @return

???? */

??? @RequestMapping(value="/{userUid}",method= RequestMethod.DELETE)

??? public Object delete(@PathVariableString userUid) {

??? ????? System.out.println("數(shù)據(jù)庫持久層操作");

?????????????????? return userUid;

??? }

??? /**

???? * 查詢單條數(shù)據(jù)(VISIT)

???? * @param userUid

???? * @return

???? */

??? @RequestMapping(value="/{userUid}",method= RequestMethod.GET)

??? public Object info(@PathVariableString userUid) {

??? ????? System.out.println("數(shù)據(jù)庫查詢操作");??? ??????

??? ????? returnuserUid;

??? }

}

REST設(shè)計(jì)風(fēng)格魄藕,簡單地說就是資源定位,每一個(gè)資源對應(yīng)一個(gè)網(wǎng)址撵术,既然是資源背率,那就不應(yīng)該有非名詞存在。這也是上面面試官問接口命名規(guī)范的最終原因(看來不管自己怎么回答都是錯(cuò)嫩与,不回答也是錯(cuò))寝姿,如果接口的命名規(guī)范不按照這個(gè)來,那也稱不上遵循什么RESTFul設(shè)計(jì)規(guī)范了划滋。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ④

代碼寫好了饵筑,還要測試吧,GET可以直接在瀏覽器進(jìn)行測試处坪,POST根资、PUT、DELETE這三種方法可以使用模擬器測試同窘,在這里使用API POST工具玄帕。

本人使用的開發(fā)環(huán)境是Spring Boot 2.1.4.RELEASE版本的,對應(yīng)的Spring Cloud版本是Greenwich.SR1塞椎。

GET方法測試結(jié)果如下桨仿,這個(gè)方法也可以直接在瀏覽器上進(jìn)行測試睛低。

圖-2


POST方法測試結(jié)果如下案狠,這個(gè)就得用模擬器進(jìn)行模擬了。

圖-3


在做PUT測試時(shí)钱雷,后臺總是報(bào)錯(cuò)骂铁,報(bào)錯(cuò)信息如下:

圖-4


API POST模擬工具這邊報(bào)500的錯(cuò)誤,如下圖:

圖-5


org.apache.tomcat.util.http.fileupload.FileUploadException罩抗,不明白為何報(bào)上傳文件的錯(cuò)誤拉庵,難道還要限制上傳文件的大小不成,這里并沒有涉及任何上傳文件呀套蒂,只是文本類型,在網(wǎng)上查了一下資料,加了一個(gè)header就可以了柬采。

圖-6


DELETE測試報(bào)的錯(cuò)誤和PUT一樣斑芜,在DELETE中杏头,只有請求頭续语,沒有body的厦画,還需要設(shè)置什么呢?

圖-7

繼續(xù)踩坑,在header中加了一個(gè)Content-Type怖糊,并設(shè)置為application/x-www-form-urlencoded;好吧,這下OK了扰魂。

圖-8

還有一個(gè)注意點(diǎn),附在URI后面的參數(shù),在接收時(shí)砰识,是必須加@PathVariable注解進(jìn)行修飾的,否則在后臺是獲取不到參數(shù)的。

圖-9


RESTFul設(shè)計(jì)風(fēng)格的簡單使用,就告一個(gè)段落了,入門級的使用還是比較簡單的,只是在使用的過程中护盈,會(huì)遇到很多坑,需要一個(gè)一個(gè)踩,你get到了嗎撤师?

可是有人會(huì)說淤袜,做這個(gè)測試可以不用API POST工具积蔚,那用什么呢,請看下集繼續(xù)。

有一個(gè)疑問還沒有想明白幅狮,那就是Content-Type為何要換成application/x-www-form-urlencoded;? 難道是因?yàn)锳PI POST模擬了瀏覽器慌烧?

application/x-www-urlencoded是瀏覽器默認(rèn)的編碼格式

multipart/form-data是form表單提交

application/json是ajax請求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玄括,更是在濱河造成了極大的恐慌冯丙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遭京,死亡現(xiàn)場離奇詭異胃惜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哪雕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門船殉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斯嚎,你說我怎么就攤上這事利虫“ず瘢” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵糠惫,是天一觀的道長疫剃。 經(jīng)常有香客問我,道長硼讽,這世上最難降的妖魔是什么巢价? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮固阁,結(jié)果婚禮上壤躲,老公的妹妹穿的比我還像新娘。我一直安慰自己备燃,他們只是感情好柒爵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赚爵,像睡著了一般棉胀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冀膝,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天唁奢,我揣著相機(jī)與錄音,去河邊找鬼窝剖。 笑死麻掸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赐纱。 我是一名探鬼主播脊奋,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疙描!你這毒婦竟也來了诚隙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤起胰,失蹤者是張志新(化名)和其女友劉穎久又,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體效五,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡地消,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畏妖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脉执。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖戒劫,靈堂內(nèi)的尸體忽然破棺而出半夷,到底是詐尸還是另有隱情婆廊,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布玻熙,位于F島的核電站否彩,受9級特大地震影響疯攒,放射性物質(zhì)發(fā)生泄漏嗦随。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一敬尺、第九天 我趴在偏房一處隱蔽的房頂上張望枚尼。 院中可真熱鬧,春花似錦砂吞、人聲如沸署恍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盯质。三九已至,卻和暖如春概而,著一層夾襖步出監(jiān)牢的瞬間呼巷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工赎瑰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留王悍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓餐曼,卻偏偏與公主長得像压储,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子源譬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349