當(dāng) Backbone.js 遇上非 CRUD API

最近使用 Backbone.js 開發(fā)客戶端時發(fā)現(xiàn)了一個看似很小挣棕,實則非常麻煩的問題:

如何與非 CRUD 式的 RESTFul API 交互宁玫。

舉個例子贷盲,有一個活動 activity
模型淘这,它可以被開啟或者停止剥扣,有兩種解決方案:

  1. 使用 put 或者 patch巩剖,比如 /service/activities/:id 并傳遞參數(shù) {status: :active}
  2. 使用額外的 endpoint, 比如 /service/activities/:id/active

如果使用第一種方式铝穷,那么就是標(biāo)準(zhǔn)的 CRUD 式的 API,Backbone.js
默認(rèn)就支持佳魔。

但是實際上開啟一個活動是一個比較大的動作曙聂,可能需要調(diào)用其他模塊的功能,不是簡單的改一個字段鞠鲜。

因此從 api 設(shè)計的角度我是傾向于使用第二種方式的宁脊。可是奇怪的是關(guān)于 Backbone.js 調(diào)用 CRUD 以外 的 API 的文章非常少贤姆,我翻遍 google 就勉強找到了這篇榆苞。通過臨時改變 model 的 url 屬性來實現(xiàn)的。 并沒有太讓我滿意霞捡。

正好晚上向 vincent 請教了一下這個問題坐漏,因為討論的重點是 api 設(shè)計而不是 backbone 的具體實現(xiàn), 反而開闊了我的思路碧信。

重新復(fù)習(xí)了一下 RESTful 的相關(guān)知識赊琳,發(fā)現(xiàn)了一個常見誤區(qū):

最常見的一種設(shè)計錯誤,就是URI包含動詞砰碴。因為"資源"表示一種實體躏筏,所以應(yīng)該是名詞,URI不應(yīng)該有動詞呈枉,動詞應(yīng)該放在HTTP協(xié)議中趁尼。

對于這個觀點爭論不少,畢竟類似于 /service/activities/:id/active 這樣的設(shè)計還是很常見的猖辫。 這個 AOE 范圍有點大酥泞。。住册。stackoverflow上有個討論可以參考婶博。其中我比較贊同的一點是:

In general, when you think you need more verbs, it may actually mean
that your resources need to be re-identified.

這里 提出的三種解決方案也可以參考。

舉個例子:

print_book_example

你是想打印一本書荧飞,還是發(fā)起一個打印的訂單請求凡人?

一樣的道理,我是要激活一個活動叹阔,還是發(fā)起一個激活活動的請求挠轴?

這個例子中,使用了名詞代替動詞耳幢。一旦變成了名詞岸晦,我立馬想到可以新建一個 model欧啤。

這下,只要創(chuàng)建一個 Backbone.js 的模型 startActivity, 把它的 url 指向
/service/activities/:id/active 启上。

當(dāng)發(fā)起請求后(激活由于業(yè)務(wù)邏輯的限制邢隧,未必就會成功),后續(xù)的邏輯就可以都放在這個 startActivity 對象中冈在。

如果激活失敗就顯示錯誤信息倒慧,成功則通知 activity 模型重新渲染自己的視圖。

這樣結(jié)構(gòu)更加清晰包券。這未必是最好的解決方案纫谅,但是不失為一種不錯的思路。

這次我犯的錯誤是溅固,一開始總是從 Backbone.js 的方面找問題付秕。想要把 Backbone.js 變成 一把錘子來解決這個釘子。二是對 RESTful 這樣比較基礎(chǔ)的知識的理解還是不夠侍郭,否則思路也不會這么局限询吴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市励幼,隨后出現(xiàn)的幾起案子汰寓,更是在濱河造成了極大的恐慌,老刑警劉巖苹粟,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件有滑,死亡現(xiàn)場離奇詭異,居然都是意外死亡嵌削,警方通過查閱死者的電腦和手機毛好,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苛秕,“玉大人肌访,你說我怎么就攤上這事⊥Ы伲” “怎么了吼驶?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長店煞。 經(jīng)常有香客問我蟹演,道長,這世上最難降的妖魔是什么顷蟀? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任酒请,我火速辦了婚禮,結(jié)果婚禮上鸣个,老公的妹妹穿的比我還像新娘羞反。我一直安慰自己布朦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布昼窗。 她就那樣靜靜地躺著是趴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膏秫。 梳的紋絲不亂的頭發(fā)上右遭,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天做盅,我揣著相機與錄音缤削,去河邊找鬼。 笑死吹榴,一個胖子當(dāng)著我的面吹牛亭敢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播图筹,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼帅刀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了远剩?” 一聲冷哼從身側(cè)響起扣溺,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓜晤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雄坪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年砖瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片足画。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡雄驹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淹辞,到底是詐尸還是另有隱情医舆,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布象缀,位于F島的核電站蔬将,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏攻冷。R本人自食惡果不足惜娃胆,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望等曼。 院中可真熱鬧里烦,春花似錦凿蒜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丧蘸,卻和暖如春漂洋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背力喷。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工刽漂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弟孟。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓贝咙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拂募。 傳聞我的和親對象是個殘疾皇子庭猩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容