二者沒有高下之分,無非是一種約定俗成的標準。習慣用RPC就用RPC,能理解REST就用REST。程序員
JSON-RPC比較符合直觀,格式也相對寬鬆;緩存
REST最近正流行,有本身的一套設計規範。session
REST面對的疑問跟當年剛開始流行面向對象時的狀況是同樣的。函數
它適合不少狀況,但並不適合全部狀況。url
最差的結果就是盲目跟風,又對REST的概念和理念只知其一;不知其二,最後搞出一個半吊子的怪胎,還自我標榜用了流行的RESTful API。設計
REST是一種設計風格,它的不少思惟方式與RPC是徹底衝突的。對象
RPC的思想是把本地函數映射到API,也就是說一個API對應的是一個function,我本地有一個getAllUsers,遠程也能經過某種約定的協議來調用這個getAllUsers。至於這個協議是Socket、是HTTP仍是別的什麼並不重要;接口
RPC中的主體都是動做,是個動詞,表示我要作什麼。資源
而REST則否則,它的URL主體是資源,是個名詞。並且也僅支持HTTP協議,規定了使用HTTP Method表達本次要作的動做,類型通常也不超過那四五種。這些動做表達了對資源僅有的幾種轉化方式。開發
這種設計思路是反程序員直覺的,由於在本地業務代碼中仍然是一個個的函數,是動做,但表如今接口形式上則徹底是資源的形式。
就像面向對象的「萬物皆對象」理論在習慣了純粹面向過程開發的程序員眼裏顯得十分別扭同樣:個人代碼原本就是按順序、循環、分支這麼運行的啊,爲啥非得在很明確的結構上封裝一層一層的基類子類接口,還要故意給兩個函數起同一個名字,調用時才選擇用哪個呢?
使用「萬物皆資源」的思想編寫實際項目中的API接口時,最多見的問題就是「這玩意究竟是個什麼資源?………………算了,我就直接寫吧,無論什麼風格了」
其實在理解了REST後,這些都不是什麼無解的難題,只是思惟方式要轉換一下:
……等等等。
若是隻是規定了一種規範,卻不理解它表相下面的思惟方式,實施中又按照本身的理解隨意變更,那結果確定是混亂不堪的。
固然,API怎麼寫是開發者的自由。但若是一個API在url裏放一堆動詞、資源設計混亂、各類亂用HTTP Method和Status Code,還自稱RESTful API的話,那就像你養了一條狗,還管它叫貓同樣。
這種混搭產物,不如叫它REFU吧。
(Remove Extension From Url:從url裏去掉文件擴展名)
前面說了半天REST的理念和不懂REST形成的問題,可是,這並不表明REST比RPC更「高等」,更不是說不理解REST的人是落伍的。
所謂代碼風格、接口形式、各類林林總總的格式規定,其實都是爲了在團隊內部造成共識、防止我的習慣差別引發的混亂。JSON-RPC固然也是有規範的,但相比REST實在寬鬆太多了。
若是一個開發團隊規定必須在url裏寫action,全部請求都是POST,能夠嗎?固然也沒問題,只是不要拿出去標榜本身寫的是RESTful API就行。
規範最終仍是爲了開發者和軟件產品服務的,若是它能帶來便利、減小混亂,就值得用;反之,若是帶來的麻煩比解決的還多,那就犯不上純粹跟風追流行了。