關于REST API設計的一些小經驗

版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明http://phoenixtoday.blogbus.com/logs/45855234.html

最近小組里有一些關于REST API設計的討論,有些收獲,打算在這里寫一下。通常來講設計第一個版本的REST API并不難,難點在于將來你要改變了這些API,而客戶那里已經有對應的客戶端實現, 那么你怎么保證兼容?或者,至少,你應當讓這些東西失效吧,這樣客戶才能知道。所以基本上就是兩個問題。

1,在最初設計時,如何盡量保證向后兼容?(這里不提倡過度設計噢,我們是搞敏捷的,哈哈)

2,如果API發生了改變,該怎么通知已有實現?

對于第一個問題,答案相對而言簡單一些:支持必要的,但是最少的東西,而且層次不要太多。為什么?用下面的xml,舉個例子來說



<person>

<name>phoenix</name>

<job>softerware developer</job>

<company>ThoughtWorks</company>

</person>



第一層,指的是這個xml具體針對什么,第二層有三個屬性,分別是name,job和company,這是一個嵌套層次很好的,而且也沒有包含過多的信息。但是如果我們在一開始再加上address屬性(假設它并非必要),那么如果客戶構建了一個客戶端也的確包含了address屬性,那么在下一個版本的API中,你把這個屬性去掉了。問題是不是出現了?客戶的軟件無法工作了。反過來,如果最開始的版本不包含address,但是有客戶強烈要求下一個版本要支持,那么怎么辦?簡單!在下一個版本加上就好了,對于已有的客戶端,多一行冗余數據而已,也不會導致客戶的軟件無法工作。好了,這個問題解決了,那么,什么是嵌套層次不要太多。舉個反例



<person>

<name>phoenix</name>

<job>softerware developer</job>

<company>

<name>ThoughtWorks</name>

<locations type="array">

<city>beijing</city>

<city>san francisco</city>

</locations>

<products>

<product>

<name>mingle</name>

</product>

<product>

<name>cruise</name>

</product>

<product>

<name>twist</name>

</product>

</products>

</company>

</person>



這叫層次太多!一個company里,包含了太多的嵌套信息,其中location還算說的過去(因為只是一個簡單的數組),但是products里包含了子對象就不對了,這就是第三層對象了,具體的解決方案可以利用url來替換掉。世界終于清靜啦!

可是我還不能清靜,因為要回答第二個問題:API改變了,該怎么通知已有實現?這是一個很頭疼的問題,如果能避免回答我絕對會避免,可惜,不能!通常有兩種解決方案,但目的都是為了讓客戶的軟件失效(我知道,我知道,這會讓客戶抓狂,可是我們也沒轍啊!所以還是能不動,則不動,打死也不動,打不死嘛......就按如下辦)a,使用帶有版本號的API URL(這是現在最經常使用的一種方法),例如api/v2/projects/members.xml前面的api不說也明白,v2就是version 2版本2的意思,如果更換了,就變v3,客戶的軟件不能用了,也就知道了;b,利用HTTP header 里的ACCEPT來解決(別說你寫了這么多年程序,連HTTP有HEAD都不知道啊!會被鄙視的!),ACCEPT可以設置接受的文件,你可以將版本信息放在里面。技術細節不多說了,給個鏈接,供大家參考 http://barelyenough.org/blog/2008/05/versioning-rest-web-services/ 其實我是比較贊成這種方式的,比較優雅,但缺點就是它還不是標準,對方的程序員也可能不知道HTTP有HEAD,所以做起來,對人家可能會有點復雜,這里就不再多說了。

總之昵~~,小初(想必盯我博客很久的人,也都知道我姓甚名誰了,以后我就用真名了)的技術博客在沉寂了,這么久之后,又回來了(我胡XX又回來啦!哈哈),有太多東西要寫了,以后會陸續帶給大家的,多謝捧場!

PS:為啥Blogbus不支持<pre>標簽呢,讓我的xml這么丑的出現在博客里?慚愧呀!

轉載于:https://www.cnblogs.com/hnrainll/archive/2011/08/16/2140445.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248389.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1037 在霍格沃茨找零錢

題目傳送門&#xff1a;https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232 題解&#xff1a; #include<iostream> using namespace std;int main() {int Galleon1, Sickle1, Knut1, Galleon2, Sickle2, Knut2;char c;cin >> Galleon…

我對創業和管理的一些看法

創業&#xff0c;對于剛工作的人&#xff0c;會比較興奮&#xff0c;因為創業充滿想象力&#xff1b;對于工作幾年的人&#xff0c;會比較向往&#xff0c;因為壓抑得太久。其實&#xff0c;創業和就業一樣&#xff0c;只是實現自己人生價值的兩種方式&#xff0c;關鍵是心態問…

關于Anaconda的環境和包管理

Anaconda相對于原生python解釋器具有更好的包管理功能&#xff0c;它有一個env文件夾&#xff0c;里面包含所要管理的所有環境&#xff1b;日常操作時我們可能會使用pytorch、Tensorflow等多個環境&#xff0c;由于每個環境對Python的包的兼容性都不一樣&#xff0c;所以我們可…

WCF basicHttpBinding之Message Security Mode

原創地址&#xff1a;http://www.cnblogs.com/jfzhu/p/4067873.html 轉載請注明出處 前面的文章《WCF Security基本概念》介紹了WCF的security mode&#xff0c;簡單說Transport是transport級別上的加密&am…

戰略游戲

題目描述 Bob喜歡玩電腦游戲&#xff0c;特別是戰略游戲。但是他經常無法找到快速玩過游戲的辦法。現在他有個問題。 他要建立一個古城堡&#xff0c;城堡中的路形成一棵樹。他要在這棵樹的結點上放置最少數目的士兵&#xff0c;使得這些士兵能了望到所有的路。 注意&#xff0…

Vue語法學習第三課——計算屬性

模板內的表達式非常便利&#xff0c;但是設計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。對于任何復雜邏輯&#xff0c;都應當使用計算屬性。 <div id"example"><p>original message : "{{message}}"</p&…

云計算學習資料分享:type查看命令

type 查看命令類型&#xff0c;例如該命令是alias&#xff0c;還是內置命令&#xff0c;還是某個文件&#xff0c;還是關鍵字 哪種神仙&#xff1a;天上還是地上&#xff0c;還是水里游的 [roottianyun ~]# type ll ll is aliased to ls -l --colorauto [roottianyun ~]# type …

neo4j刪除所有節點

MATCH (n)OPTIONAL MATCH (n)-[r]-()DELETE n,r轉載于:https://www.cnblogs.com/luoganttcc/p/10525189.html

Hadoop RPC實例

本文發表于本人博客。 上次寫了個hadoop偽分布環境搭建的筆記了&#xff0c;今天來說下hadoop分布式構建的基礎RPC&#xff0c;這個RPC在提交Job任務的時候底層就是創建了RPC來實現遠程過程調用服務端。 我們首先可以通過Job的waitForCompletion(boolean verbose)方法來跟蹤代碼…

Django 模板語言 標簽

前言&#xff1a;django的模板語法基本和flask的jinja2基本一樣。下面比較一下兩個模板語法的區別。 &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;深度變量的查找&#xff08;萬能的句點號&#xff09; 在 Django 模板中遍歷復雜數據結構的關鍵是…

電子書下載:Illustrated C# 2012 4th

下載&#xff1a;http://www.ctdisk.com/file/9015906轉載于:https://www.cnblogs.com/MaxWoods/archive/2012/08/26/2657752.html

關于83版射雕英雄傳

今天無意中看到網上一群人關于83版射雕的一些爭論.或許一些現在的年輕人不喜歡83版射雕,說那太老土了,但想想那個時代的條件,能拍出這樣的片子,是非常不錯的,而且我覺得83版射雕也是最忠于原著的,跟后來的翻版比較,雖然從畫面效果,人物服裝方面存在差距,但這都是由于歷史原因和…

ZOJ 3735 Josephina and RPG

思路&#xff1a;dp[i][j]:第i輪打完后&#xff0c;決定以j陣容打下一輪 保持原有陣容&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] * p [ j ][ s [ i ] ] 換成第i輪怪的陣容: for(int k0;k<r;k)dp[i][j]max(dp[i][j],dp[i-1][k]*p[k][s[i]]) 優化&#xff1a;用滾動數組&am…

4~20mA電流輸出芯片XTR111完整電路(轉)

源&#xff1a; 4~20mA電流輸出芯片XTR111完整電路轉載于:https://www.cnblogs.com/LittleTiger/p/10511115.html

電子書下載:Programming Microsoft LINQ in Microsoft .NET Framework 4

Book DescriptionDig into LINQ — and transform the way you work with data. With LINQ, you can query data from a variety of sources — including databases, objects, and XML files — directly from Microsoft Visual Basic or C#. Guided by data-access experts w…

原型模式 —— Java的賦值、淺克隆和深度克隆的區別

賦值 直接 &#xff0c;克隆 clone 假如說你想復制一個簡單變量。很簡單&#xff1a; int a 5; int b a; b 6;這樣 a 5, b 6 不僅僅是int類型&#xff0c;其它七種原始數據類型(boolean,char,byte,short,float,double.long)同樣適用于該類情況。 但是如果你復制的是一個…

一個醫院院長電視機壞了,拿到一個大修理店去修

一個醫院院長電視機壞了&#xff0c;拿到一個大修理店去修。修理店接待人員:“OK&#xff0c;開機費50元”醫院院長: “為什么還沒修理就要先交費”&#xff1f;修理店接待人員: “我們修理店的制度就是這樣&#xff0c;你們醫院的掛號費&#xff0c;不是沒看病之前就要交嗎”&…

[scrum]2011/9/24-----第四天

scrum 總結&#xff1a; Team member Yesterday’s Work Today’s Work Issue R X Task201&#xff1a;Active Agenda Page的重寫&#xff0c;界面設置 Task201&#xff1a;Active Agenda Page 界面的美化&#xff0c;收縮折疊&#xff0c;并添加一些動畫效果 Task 243:…

c# 前后日期設置

List<string> list new List<string>(); //根據當月 顯示前6個月 for(int i0;i<6;i) { list.add(DateTime.Now.AddMonths(i*-1).Tostring()); }轉載于:https://www.cnblogs.com/Dcz1996/p/10515429.html

jq-AJAX 初步了解

js的異步操作(1) 定時器 (2) 事件 (3) 回調 (4) ajax Ajax優點 可以局部更新網頁內容。 ajax的本質就是xmlHttpRequest對象控制臺出現三個屬性 readyState 請求的五個階段 0 1 2 3 4 responseText 返回的文件內容 Status 狀態嗎 返回的狀態信息 在__proto__有三個方法 …