<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-295  評論-26  文章-1  trackbacks-0

    在了解REST API URI設(shè)計的規(guī)則之前,讓我們快速瀏覽一些我們將要討論的術(shù)語。

    URIs

    REST API使用統(tǒng)一資源標識符(URI)來尋址資源。在當今互聯(lián)網(wǎng)上,充斥著各種各樣的URI設(shè)計規(guī)則,既有像//api.example.com/louvre/leonardo-da-vinci/mona-lisa這樣能夠清楚的傳達API資源模型的文章,也有很難理解的文章,例如://api.example.com/68dd0-a9d3-11e0-9f1c-0800200c9a66 ;Tim Berners-Lee在他的“Axioms of Web Architecture”一文中將URI的不透明度總結(jié)成一句話:

    唯一可以使用標識符的是引用對象。在不取消引用時,就不應(yīng)該查看URI字符串的內(nèi)容以獲取其他信息。 
    ——蒂姆·伯納斯 - 李

    客戶端必須遵循Web的鏈接范例,將URI視為不透明標識符。

    REST API設(shè)計人員應(yīng)該在考慮將REST API資源模型傳達給潛在的客戶端開發(fā)者的前提下,創(chuàng)造URI。在這篇文章中,我將嘗試為REST API URI 引入一套設(shè)計規(guī)則

    先跳過規(guī)則,URI的通用語法也適用與本文中的URI。RFC 3986定義了通用URI語法,如下所示:

    URI = scheme “://” authority “/” path [ “?” query ][ “#” fragment ]

    規(guī)則1:URI結(jié)尾不應(yīng)包含(/)

    這是作為URI路徑中處理中最重要的規(guī)則之一,正斜杠(/)不會增加語義值,且可能導(dǎo)致混淆。REST API不允許一個尾部的斜杠,不應(yīng)該將它們包含在提供給客戶端的鏈接的結(jié)尾處。

    許多Web組件和框架將平等對待以下兩個URI: 
    http://api.canvas.com/shapes/ 
    http://api.canvas.com/shapes

    但是,實際上URI中的每個字符都會計入資源的唯一身份的識別中。

    兩個不同的URI映射到兩個不同的資源。如果URI不同,那么資源也是如此,反之亦然。因此,REST API必須生成和傳遞精確的URI,不能容忍任何的客戶端嘗試不精確的資源定位。

    有些API碰到這種情況,可能設(shè)計為讓客戶端重定向到相應(yīng)沒有尾斜杠的URI(也有可能會返回301 - 用來資源重定向)。

    規(guī)則2:正斜杠分隔符(/)必須用來指示層級關(guān)系

    URI的路徑中的正斜杠(/)字符用于指示資源之間的層次關(guān)系。

    例如: 
    (http://api.canvas.com/shapes/polygons/quadrilaterals/squares ;

    規(guī)則3:應(yīng)使用連字符( - )來提高URI的可讀性

    為了使您的URI容易讓人們理解,請使用連字符( - )字符來提高長路徑中名稱的可讀性。在路徑中,應(yīng)該使用連字符代空格連接兩個單詞 。

    例如: 
    http://api.example.com/blogs/guy-levin/posts/this-is-my-first-post

    規(guī)則4:不得在URI中使用下劃線(_)

    一些文本查看器為了區(qū)分強調(diào)URI,常常會在URI下加上下劃線。這樣下劃線(_)字符可能被文本查看器中默認的下劃線部分地遮蔽或完全隱藏。

    為避免這種混淆,請使用連字符( - )而不是下劃線

    規(guī)則5:URI路徑中首選小寫字母

    方便時,URI路徑中首選小寫字母,因為大寫字母有時會導(dǎo)致一些問題。RFC 3986將URI定義為區(qū)分大小寫,但scheme 和 host components除外。

    例如: 
    http://api.example.com/my-folder/my-doc

    HTTP://API.EXAMPLE.COM/my-folder/my-doc 
    這個URI很好。URI格式規(guī)范(RFC 3986)認為該URI與URI#1相同。

    http://api.example.com/My-Folder/my-doc 
    而這個URI與URI 1和2不同,這可能會導(dǎo)致不必要的混淆。

    規(guī)則6:文件擴展名不應(yīng)包含在URI中

    在Web上,(.)字符通常用于分隔URI的文件名和擴展名。 
    REST API不應(yīng)在URI中包含人造文件擴展名,來指示郵件實體的格式。相反,他們應(yīng)該依賴通過Content-Type中的header傳遞media type,來確定如何處理正文的內(nèi)容。

    http://api.college.com/students/3248234/courses/2005/fall.json 
    http://api.college.com/students/3248234/courses/2005/fall

    如上所示:不應(yīng)使用文件擴展名來表示格式。

    應(yīng)鼓勵REST API客戶端使用HTTP提供的格式選擇機制Accept request header。

    為了是鏈接和調(diào)試更簡單,REST API應(yīng)該支持通過查詢參數(shù)來支持媒體類型的選擇。

    規(guī)則7:端點名稱是單數(shù)還是復(fù)數(shù)?

    keep-it-simple的原則在這里同樣適用。雖然一些”語法學(xué)家”會告訴你使用復(fù)數(shù)來描述資源的單個實例是錯誤的,但實際上為了保持URI格式的一致性建議使用復(fù)數(shù)形式。

    本著API提供商更容易實施和API使用者更容易操作的原則,可以不必糾結(jié)一些奇怪的復(fù)數(shù)(person/people,goose/geese)。

    但是應(yīng)該怎么處理層級關(guān)系呢?如果一個關(guān)系只能存在于另一個資源中,RESTful原則就會提供有用的指導(dǎo)。我們來看一下這個例子。學(xué)生有一些課程。這些課程在邏輯上映射到學(xué)生終端,如下所示:

    http://api.college.com/students/3248234/courses - 檢索id為3248234的學(xué)生學(xué)習(xí)的所有課程的清單。 
    http://api.college.com/students/3248234/courses/physics -檢索該學(xué)生的物理課程

    結(jié)論

    當你在設(shè)計REST API服務(wù)時,您必須注意這些由URI定義的資源。

    正在構(gòu)建的服務(wù)中的每個資源將至少有一個URI標識它。這個URI最好是有意義的,且能充分描述資源。URI應(yīng)遵循可預(yù)測的層次結(jié)構(gòu),用來提高其可理解性,可用性:可預(yù)測的意義在于它們是一致的,它的層次結(jié)構(gòu)在數(shù)據(jù)關(guān)系上是有意義的。

    RESTful API是為使用者編寫的。URI的名稱和結(jié)構(gòu)應(yīng)該能夠向使用者傳達更清晰的含義。通過遵循上述規(guī)則,您將創(chuàng)建一個更清晰的的REST API與更友好的客戶端。這些并不是REST的規(guī)則或約束,僅僅是API的增強和補充。

    我也建議你來看看http://blog.restcase.com/5-basic-rest-api-design-guidelines/這篇文章。

    最后,望大家牢記:你在為你的客戶端設(shè)計API URI,而不僅僅是為你的數(shù)據(jù)。



    大盤預(yù)測 國富論
    posted on 2017-06-26 09:50 華夢行 閱讀(227) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: **一级一级毛片免费观看| 香蕉视频在线免费看| 99久久免费国产精品特黄| 亚洲综合国产精品| 外国成人网在线观看免费视频| 亚洲国产一成人久久精品| 你懂的在线免费观看| 成人免费一区二区三区| 久久精品a一国产成人免费网站| 四虎精品亚洲一区二区三区| 国产亚洲综合视频| 亚洲免费观看网站| 亚洲日产2021三区在线| 一级毛片免费视频网站| 337p日本欧洲亚洲大胆裸体艺术| 成在线人免费无码高潮喷水| 亚洲爆乳无码专区| 69式互添免费视频| 亚洲AV电影天堂男人的天堂| 51视频精品全部免费最新| 亚洲欧洲日产国码二区首页| 超pen个人视频国产免费观看| 亚洲欧洲国产精品你懂的| 猫咪免费人成网站在线观看入口| 无码专区一va亚洲v专区在线 | 亚洲日韩区在线电影| 永久在线免费观看| jizzjizz亚洲日本少妇| 亚洲性猛交XXXX| 青青草免费在线视频| 一级毛片a免费播放王色电影| 成人超污免费网站在线看| 国产亚洲精品美女久久久久| 亚洲精品狼友在线播放| 久久国内免费视频| 特级毛片爽www免费版| 亚洲综合激情另类小说区| 免费A级毛片av无码| 亚洲国产精品无码久久| 亚洲中文字幕久久精品无码APP| 4虎永免费最新永久免费地址|