精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何更好的設(shè)計RESTful API

開發(fā)
構(gòu)建API是您可以做的最重要的事情之一,以提高您的服務(wù)的價值。 通過使用API,您的服務(wù)/核心應(yīng)用程序有可能成為其他服務(wù)增長的平臺。 看看當前巨大的科技公司:Facebook,Twitter,谷歌,GitHub,亞馬遜,Netflix …沒有一個人會像今天一樣大,如果他們沒有通過API打開他們的數(shù)據(jù)。 事實上,整個行業(yè)存在的唯一目的是消費由所述平臺提供的數(shù)據(jù)。

當您的數(shù)據(jù)模型已開始穩(wěn)定,您可以為您的網(wǎng)絡(luò)應(yīng)用程序創(chuàng)建公共API。 你意識到,很難對你的API進行重大更改,一旦它發(fā)布,并希望盡可能得到盡可能多的前面。 現(xiàn)在,互聯(lián)網(wǎng)對API設(shè)計的意見有很多。 但是,因為沒有一個廣泛采用的標準在所有情況下都有效,所以你前面有一堆選擇:你應(yīng)該接受什么格式? 你應(yīng)該如何認證? 你的API是否應(yīng)該版本化?構(gòu)建API是您可以做的最重要的事情之一,以提高您的服務(wù)的價值。 通過使用API,您的服務(wù)/核心應(yīng)用程序有可能成為其他服務(wù)增長的平臺。 看看當前巨大的科技公司:Facebook,Twitter,谷歌,GitHub,亞馬遜,Netflix …沒有一個人會像今天一樣大,如果他們沒有通過API打開他們的數(shù)據(jù)。 事實上,整個行業(yè)存在的唯一目的是消費由所述平臺提供的數(shù)據(jù)。

你的API越簡單明了,使用的人就越多。

許多在網(wǎng)絡(luò)上發(fā)現(xiàn)的API設(shè)計觀點是圍繞主觀的模糊標準解釋的學術(shù)討論,而不是在現(xiàn)實世界中有意義的。 我的目標是描述一個為當今的Web應(yīng)用程序設(shè)計的務(wù)實的API的***實踐。 我沒有嘗試滿足一個標準,如果它不覺得正確。 為了幫助指導決策過程,我寫了一些API必須努力達到的要求:

  • 它應(yīng)該使用Web標準,他們有意義
  • 它應(yīng)該對開發(fā)人員友好,可以通過瀏覽器地址欄探索
  • 它應(yīng)該簡單,直觀和一致,使采用不僅容易,而且愉快
  • 它應(yīng)該提供足夠的靈活性來支持大部分我們所設(shè)計的UI
  • 應(yīng)該是有效的,同時保持與其他要求的平衡

API是開發(fā)人員的UI – 就像任何UI一樣,確保用戶的體驗被仔細考慮是非常重要的!

RESTful API設(shè)計定義

以下是我將在本文檔中使用的一些重要術(shù)語:

  • Resource :對象的單個實例。 例如,一只動物。
  • 集合:對象的集合。 例如,動物。
  • HTTP :用于通過網(wǎng)絡(luò)通信的協(xié)議。
  • Consumer :能夠發(fā)出HTTP請求的客戶端計算機應(yīng)用程序。
  • 第三方開發(fā)人員:不是您項目的一部分,但希望使用您的數(shù)據(jù)服務(wù)的開發(fā)人員。
  • 服務(wù)器:可通過網(wǎng)絡(luò)從客戶端訪問的HTTP服務(wù)器/應(yīng)用程序。
  • 端點:服務(wù)器上的API網(wǎng)址,表示資源或整個集合。
  • 冪等:無邊際效應(yīng),多次操作得到相同的結(jié)果。
  • 網(wǎng)址區(qū)段:網(wǎng)址中的斜線分隔的信息。

數(shù)據(jù)設(shè)計和抽象

首先將從你寫的開發(fā)文檔API開始(比如我們可以看到各個開發(fā)平臺的暴露出來的API文檔),您需要決定如何設(shè)計數(shù)據(jù),以及您的核心服務(wù)/應(yīng)用程序如何工作。 如果你在做的API是***次開發(fā),這應(yīng)該很容易。 如果您要將API附加到現(xiàn)有項目,則可能需要提供更多抽象(畢竟是要按照已有的文檔規(guī)范來做)。

有時,集合可以表示數(shù)據(jù)庫表,資源可以表示該表中的一行。 然而,這不是通常的情況。 事實上,你的API應(yīng)該盡可能多地抽象出你的數(shù)據(jù)和業(yè)務(wù)邏輯。 非常重要的一點是,如果您不希望使用你的API很難使用,就不要使用任何復雜的應(yīng)用程序數(shù)據(jù)來為難第三方開發(fā)人員(讓開發(fā)人員覺得還得對這些數(shù)據(jù)進一步處理而浪費更多精力)。

還有你的服務(wù)的很多部分,你不應(yīng)該通過API公開。 一個常見的例子是許多API不允許第三方創(chuàng)建用戶。

設(shè)計資源請求

當然你知道GET和POST請求。當您的瀏覽器訪問不同的網(wǎng)頁時,這兩個最常用的請求。POST是如此受歡迎,它甚至流行語我們的平常的說話中,即使那些不知道互聯(lián)網(wǎng)如何工作的人也知道他們可以“發(fā)布”的東西在朋友的Facebook上。

有四個半非常重要的HTTP動詞,你需要知道。我說“一半”,因為PATCH動詞非常類似于PUT動詞,兩個通常由許多API開發(fā)人員組合。這里是動詞,在他們旁邊是他們相關(guān)的數(shù)據(jù)庫調(diào)用(我假設(shè)大多數(shù)人讀這個知道更多關(guān)于寫入數(shù)據(jù)庫而不是設(shè)計一個API)。

  • GET (SELECT):從服務(wù)器檢索特定資源,或資源列表。
  • POST (CREATE):在服務(wù)器上創(chuàng)建一個新的資源。
  • PUT (UPDATE):更新服務(wù)器上的資源,提供整個資源。
  • PATCH (UPDATE):更新服務(wù)器上的資源,僅提供更改的屬性。
  • DELETE (DELETE):從服務(wù)器刪除資源。

這里有兩個較少知名的HTTP動詞:

  • HEAD - 檢索有關(guān)資源的元數(shù)據(jù),例如數(shù)據(jù)的哈希或上次更新時間。
  • OPTIONS - 檢索關(guān)于客戶端被允許對資源做什么的信息。

一個好的RESTful API將使用四個半HTTP動詞,允許第三方與其數(shù)據(jù)進行交互,并且不會將動作/動詞作為URL段。

通常,GET請求可以被緩存(通常是!)在瀏覽器,例如將緩存請求頭用于第二次用戶的POST請求。 HEAD請求基本上是一個沒有響應(yīng)主體的GET,并且也可以被緩存。

版本控制

無論你正在構(gòu)建什么,無論你事先做了多少規(guī)劃,你的核心應(yīng)用程序總會改變,你的數(shù)據(jù)關(guān)系總會改變,屬性添加和從你的資源中刪除。這只是軟件開發(fā)的工作原理,尤其是如果你的項目還活著并被許多人使用(如果你正在構(gòu)建一個API,情況可能就會如此)。

記住,API是服務(wù)器和客戶端之間的已發(fā)布約定。如果您更改了服務(wù)器API,這些更改會破壞向后兼容性,那么你就打破了這個約定,客戶端又會要求你重新支持它(誰讓客戶端依然是之前的版本,調(diào)用的還是之前的API)。為了避免這樣的事情,并讓您的客戶端滿意,您需要偶爾引入新版本的API,同時仍允許訪問舊版本。

注意,如果你只是為你的API添加新的特性,例如資源上的新屬性,或者如果你添加新的端點(比如之前只有查詢,現(xiàn)在增加一個修改),你不需要增加您的API版本號,因為這些更改不會破壞向后兼容性。當然,您將需要更新您的API文檔。

隨著時間的推移,您可以棄用API的舊版本。棄用某個功能并不意味著關(guān)閉它或者降低它的質(zhì)量,而是告訴客戶端您的API,舊版本將在特定日期刪除,并且他們應(yīng)該升級到較新的版本。

一個好的RESTful API設(shè)計將跟蹤URL中的版本。另一個最常見的解決方案是將版本號放在請求頭中,但在與許多不同的第三方開發(fā)人員合作之后,我可以告訴您,添加這些請求頭信息并不像添加網(wǎng)址細分那么容易。

分析

跟蹤客戶端使用的API的版本/端點。 這可以像每次請求時在數(shù)據(jù)庫中增加一個整數(shù)一樣簡單。 有很多原因跟蹤API Analytics是一個好主意,例如,最常用的API調(diào)用應(yīng)該是高效的。

為了構(gòu)建第三方開發(fā)者所喜歡的API,最重要的是,當您棄用某個版本的API時,實際上可以使用已棄用的API功能與開發(fā)人員聯(lián)系(在兩個異構(gòu)系統(tǒng)中當對方的開發(fā)人員調(diào)用本服務(wù)時順帶告知對方)。 這是提醒他們在棄用舊API版本之前升級的***方法。

第三方開發(fā)者通知的過程可以自動化,例如。 每當對一個已棄用的功能發(fā)出10,000個請求時,發(fā)郵件通知開發(fā)人員。

API Root URL

無論你相信與否,您的API的根位置是重要的。當開發(fā)人員使用您的API接手舊項目并需要構(gòu)建新功能時,他們可能根本不知道您有哪些服務(wù)。幸好他們知道客戶端對外調(diào)用的那些URL列表。重要的是,進入您的API的根入口點盡可能簡單,因為長的復雜URL將顯得令人生畏,并可能使開發(fā)人員直接略過而不會采用。

這里有兩個常見的URL根:

  • https://example.org/api/v1/*
  • https://api.example.com/v1/*

如果您的應(yīng)用程序龐大,或者您預計它會變得龐大,將API放在自己的子域(例如 api。)上是一個不錯的選擇。這可以允許在路上一些更靈活的可擴展性。

如果您預計您的API將不會增長到那么大,或者您想要一個更簡單的應(yīng)用程序設(shè)置(例如,您希望從同一個框架托管網(wǎng)站和API),將您的API放置在域根的URL段(例如 / api / )也有效。

將內(nèi)容設(shè)為您的API根目錄是個好主意。例如,點擊GitHub的API的根會返回一個端點列表。就個人而言,我喜歡使用根網(wǎng)址提供給開發(fā)人員認為有用的信息,例如,如何獲取API的開發(fā)人員文檔。

此外,請注意HTTPS前綴。作為一個好的RESTful API,您必須在HTTPS之后托管您的API(一個好的RESTful API總是基于HTTPS來發(fā)布的)。

端點

端點是您的API中指向特定資源或資源集合的URL。

如果你正在構(gòu)建一個虛擬的API來代表幾個不同的動物園,每個動物園包含許多動物,員工(可以在多個動物園工作)和跟蹤每個動物的物種,你可能有以下端點:

  • https://api.example.com/v1/**zoos**
  • https://api.example.com/v1/**animals**
  • https://api.example.com/v1/**animal_types**
  • https://api.example.com/v1/**employees**

當引用每個端點可以做什么時,您需要列出有效的HTTP動詞和端點組合。例如,這里有一個半全面的行動列表,可以使用我們虛構(gòu)的API執(zhí)行。請注意,我在每個端點之前都有HTTP動詞,因為這是在HTTP請求標頭中使用的相同符號。

  • GET / zoos:列出所有動物園(ID和名稱,不要太多細節(jié))
  • POST / zoos:創(chuàng)建一個新的Zoo
  • GET / zoos / ZID:檢索整個Zoo對象
  • PUT / zoos / ZID:更新Zoo(整個對象)
  • PATCH / zoos / ZID:更新Zoo(部分對象)
  • DELETE / zoos / ZID:刪除動物園
  • GET / zoos / ZID / animals:檢索動物列表(ID和名稱)。
  • GET / animals:列出所有動物(ID和名稱)。
  • POST / animals:創(chuàng)建一個新的動物
  • GET / animals / AID:檢索動物對象
  • PUT / animals / AID:更新動物(整個對象)
  • PATCH / animals / AID:更新動物(部分對象)
  • GET / animal_types:檢索所有動物類型的列表(ID和名稱)
  • GET / animal_types / ATID:檢索整個動物類型對象
  • GET / employees:檢索完整的員工列表
  • GET / employees / EID:檢索特定員工
  • GET / zoos / ZID / employees:檢索在此動物園工作的員工(ID和名稱)的列表
  • POST / employees:創(chuàng)建一個新員工
  • POST / zoos / ZID / employees:在特定動物園雇用員工
  • DELETE / zoos / ZID / employees / EID:從特定的動物園中解雇員工

在上面的列表中,ZID表示Zoo ID,AID表示動物ID,EID表示Employee ID,ATID表示動物類型ID。在你的文檔中有一個鍵,你選擇的任何約定是一個好主意。

為了簡潔,我在上面的示例中省略了常見的API網(wǎng)址前綴。雖然這在通訊期間可能很好,但在實際的API文檔中,您應(yīng)該始終顯示每個端點的完整網(wǎng)址(例如GET http://api.example.com/v1/animal_type/ATID)。

注意數(shù)據(jù)之間的關(guān)系如何顯示,特別是雇員和動物園之間的多對多關(guān)系。通過添加其他網(wǎng)址細分,您可以執(zhí)行更具體的互動。當然,對于“FIRE(解雇)”沒有HTTP動詞,但是通過對位于Zoo內(nèi)的Employee執(zhí)行DELETE,我們能夠?qū)崿F(xiàn)相同的效果。

過濾器

當客戶端請求對象列表時,請務(wù)必為它們提供符合所請求條件的每個對象的列表。這個列表可能是巨大的。但是,重要的是不要對數(shù)據(jù)執(zhí)行任何任意限制。正是這些任意的限制使第三方開發(fā)者很難知道發(fā)生了什么。如果他們請求某個集合,并迭代結(jié)果,他們從來沒有看到超過100個結(jié)果,接下來他們就不得不去查找這個限制條件的出處(提供服務(wù)端沒有問題,就只能是調(diào)用端的問題了)。到底是他們的ORM的bug導致的,還是因為網(wǎng)絡(luò)截斷了大數(shù)據(jù)包?

盡可能減少那些會影響到第三方開發(fā)者開發(fā)的無謂限制

然而,重要的是,您確實為客戶端提供了指定某種過濾/結(jié)果限制的能力。這么做最重要的一個原因是可以最小化網(wǎng)絡(luò)傳輸,客戶端盡快得到結(jié)果。第二個重要的原因是客戶端可能是懶惰的,如果服務(wù)器可以為他們做過濾和分頁,一切都更好。還有一個不那么重要的原因,請求資源越少,對服務(wù)器的一個很大的好處是,減少了負載。

過濾主要用于對資源集合執(zhí)行GET。由于這些是GET請求,因此應(yīng)通過URL傳遞過濾信息。以下是您可能想要添加到API的過濾類型的一些示例:

  • ?limit = 10:減少返回給Consumer的結(jié)果數(shù)(用于分頁)
  • ?offset = 10:向客戶端發(fā)送信息集(用于分頁)
  • ?animal_type_id = 1:過濾符合以下條件的記錄(WHERE animal_type_id = 1)
  • ?sortby = name&order = asc:根據(jù)指定的屬性對結(jié)果進行排序(ORDER BYname ASC)

其中一些過濾可能與端點URLS冗余。例如我之前提到的GET / zoo / ZID / animals。這與GET / animals是一樣的嗎?zoo_id = ZID。為客戶端提供的專用端點將使他們的開發(fā)更輕松,這對于您預期他們會做很多的請求尤其如此。在文檔中,提及這種冗余,以便第三方開發(fā)人員不會留意是否存在差異。

還有一個要說的是,每當您執(zhí)行數(shù)據(jù)的過濾或排序時,請確保您列出客戶端可以過濾和排序的列。我們不希望將任何數(shù)據(jù)庫錯誤發(fā)送給客戶端!

狀態(tài)碼

作為RESTful API,使用正確的HTTP狀態(tài)代碼非常重要;他們是一個標準!各種網(wǎng)絡(luò)設(shè)備能夠讀取這些狀態(tài)碼,例如,負載平衡器可以配置為避免向發(fā)送大量50x錯誤的Web服務(wù)器發(fā)送請求。有很多HTTP狀態(tài)代碼可供選擇,但此列表應(yīng)該是一個很好的起點:

  • 200 OK – [GET]
  • 客戶端從服務(wù)器請求數(shù)據(jù),服務(wù)器為它們找到它(等冪)
  • 201 CREATED – [POST / PUT / PATCH]
  • 客戶端提供了服務(wù)器數(shù)據(jù),并且服務(wù)器創(chuàng)建了一個資源
  • 204 無內(nèi)容 – [刪除]
  • 客戶端要求服務(wù)器刪除資源,并且服務(wù)器將其刪除
  • 400 無效請求 – [POST / PUT / PATCH]
  • 客戶端給服務(wù)器的數(shù)據(jù)不良,服務(wù)器沒有做任何事情(冪等)
  • *錯誤404 – []
    *客戶端引用了一個不存在的資源或集合,并且服務(wù)器什么也不做(冪等)
  • *500內(nèi)部服務(wù)器錯誤 – []
    *服務(wù)器遇到錯誤,并且客戶端不知道請求是否成功

狀態(tài)碼范圍

1xx 范圍保留用于底層HTTP的東西,你很可能永遠也用不到。

2xx 范圍保留用于成功消息,盡可能確保您的服務(wù)器盡可能多地向客戶端發(fā)送這些消息。

3xx 范圍保留用于重定向。大多數(shù)API不使用這些請求很多(不像SEO人使用它們那么頻繁),然而,較新的超媒體風格API將更多地使用這些請求。

4xx 范圍保留用于響應(yīng)客戶端做出的錯誤,例如。他們提供不良數(shù)據(jù)或要求不存在的東西。這些請求應(yīng)該是冪等的,而不是更改服務(wù)器的狀態(tài)。

5xx 范圍的狀態(tài)碼是保留給服務(wù)器端錯誤用的。這些錯誤常常是從底層的函數(shù)拋出來的,甚至開發(fā)人員也通常沒法處理,發(fā)送這類狀態(tài)碼的目的以確保客戶端獲得某種響應(yīng)。當收到5xx響應(yīng)時,客戶端不可能知道服務(wù)器的狀態(tài),所以這類狀態(tài)碼是要盡可能的避免。

預期的返回文檔

當使用不同的HTTP動詞對服務(wù)器端點執(zhí)行操作時,客戶端需要在返回結(jié)果里面拿到一系列的信息。 下面的列表是非常典型的RESTful API:

  • GET / collection:返回資源對象的列表(數(shù)組)
  • GET / collection / resource:返回單個Resource對象
  • POST / collection:返回新創(chuàng)建的Resource對象
  • PUT / collection / resource:返回完整的Resource對象
  • PATCH / collection / resource:返回完整的Resource對象
  • DELETE / collection / resource:返回一個空文檔

請注意,當Consumer創(chuàng)建資源時,他們通常不知道正在創(chuàng)建的資源的ID(也不知道其他屬性,如創(chuàng)建和修改的時間戳)(如果適用)。 這些附加屬性與后續(xù)請求一起返回,當然作為對初始POST的響應(yīng)。

###認證

大多數(shù)時候,一個服務(wù)器想要知道誰正在做哪些請求。當然,一些API提供公共用戶(匿名用戶)使用的,但大多數(shù)時間的工作是代表某人執(zhí)行。

OAuth 2.0提供了一個很好的方法。對于每個請求,您可以確定知道哪個客戶正在發(fā)出請求,代表他們請求哪個用戶,并提供一種(大部分)標準化的方式來過期訪問或允許用戶撤消來自客戶端的訪問權(quán),需要第三方客戶端知道用戶登錄憑據(jù)。

還有OAuth 1.0和xAuth同樣適用這樣的場景。無論您選擇哪種方法,請確保它是常見的,并且有許多不同的庫為您的客戶端可能使用的語言/平臺編寫的文檔(比如redis提供Java調(diào)用的API)。

我可以誠實地告訴你,OAuth 1.0a,雖然它是最安全的選項,但是實現(xiàn)起來很痛苦。建議你選擇一個替代品。

內(nèi)容類型

目前,最令人興奮的API提供來自RESTful接口的JSON數(shù)據(jù)。這包括Facebook,Twitter,GitHub,你命名。 XML似乎已經(jīng)失去了優(yōu)勢(除了在大型企業(yè)環(huán)境中)。 SOAP,不幸的是,它過時了,我們真的沒有看到太多的API把HTML作為結(jié)果返回給客戶端(除非你在構(gòu)建一個爬蟲程序)。

只要你返回給他們有效的數(shù)據(jù)格式,開發(fā)者就可以使用流行的語言和框架進行解析。如果你正在構(gòu)建一個通用的響應(yīng)對象并使用不同的序列化器,你也可以很容易的提供之前所提到的那些數(shù)據(jù)格式(不包括SOAP)。而你所要做的就是把使用方式放在響應(yīng)數(shù)據(jù)的接收頭里面。

一些API創(chuàng)建者建議向URL(端點之后)添加.json,.xml或.html文件擴展名以指定要返回的內(nèi)容類型,但我個人不喜歡這一點。我真的很喜歡Accept頭(它是內(nèi)置在HTTP規(guī)范),并且我覺得這么做也比較適當一些。

超媒體API

超媒體API很可能是RESTful API設(shè)計的未來。 實際上是一個非常好的概念,它回歸到了HTTP和HTML如何運作的“本質(zhì)”。

當使用非超媒體RESTful API時,URL端點是服務(wù)器和使用者之間的約定的一部分。這些端點必須由客戶端提前知道,并且更改這些端點意味著客戶端不再能夠按預期與服務(wù)器通信。你可以先假定這是一個限制。

現(xiàn)在,API客戶端已經(jīng)不僅僅只有那些創(chuàng)建HTTP請求的用戶代理了。大多數(shù)HTTP請求是由人們通過瀏覽器產(chǎn)生的。人們不會被哪些預先定義好的RESTful API端點URL所約束。是什么讓人們變的如此與眾不同?人們可以閱讀內(nèi)容,點擊鏈接,看看有趣的標題,一般來說,探索一個網(wǎng)站,解釋內(nèi)容,去他們想去的地方。即使一個URL改變,人們也不受影響(除非,他們事先給某個頁面做了書簽,在這種情況下,他們?nèi)ブ黜摬l(fā)現(xiàn)原來有一條新的路徑可以去往之前的頁面)。

超媒體API概念的工作方式與人類相同。請求API的根返回一個URL列表,它可能指向每個信息集合,并以客戶端可以理解的方式描述每個集合。為每個資源提供ID并不重要(或必需),只要提供了一個URL即可。

隨著超媒體API的客戶端爬行鏈接和收集信息,URL在響應(yīng)中始終是***的,并且不需要事先知道作為約定的一部分。如果URL被緩存,并且后續(xù)請求返回404,則客戶端可以簡單地返回到根并再次發(fā)現(xiàn)內(nèi)容。

在檢索集合中的資源列表時,將返回包含各個資源的完整URL的屬性。當執(zhí)行POST / PATCH / PUT時,響應(yīng)可以是3xx重定向到完整的資源。

JSON不僅告訴了我們需要定義哪些屬性作為URL,也告訴了我們?nèi)绾螌RL與當前文檔關(guān)聯(lián)的語義。正如你猜的那樣,HTML就提供了這樣的信息。我們可能很樂意看到我們的API走完了完整的周期,并回到了處理HTML上來。想一下我們與CSS一起前行了多遠,有一天我們甚至可能會看到,API和網(wǎng)站使用完全相同的URL和內(nèi)容是常見的做法。

文檔

老實說,即便你不能***的遵循指南中的條款,你的API不一定是糟糕的。但是,如果你不為API準備文檔的話,沒有人會知道如何使用它,那它真的會成為一個糟糕的API。

使您的文檔可用于未經(jīng)身份驗證的開發(fā)人員。

不要使用自動文檔生成器,或者如果你這樣做,你也要保證自己審閱過并使其具有更好的版式。

不要截斷示例請求和響應(yīng)正文,要展示完整的東西。在文檔中使用語法高亮指示符。

記錄每個端點的預期響應(yīng)代碼和可能的錯誤消息,以及導致這些錯誤消息可能出現(xiàn)的錯誤。

如果您有空閑時間,請構(gòu)建一個開發(fā)人員API控制臺,以便開發(fā)人員可以立即試用您的API。這不像你想象的那么難,開發(fā)者(內(nèi)部和第三方)也會因此而擁戴你!

確保您的文檔可以打印; CSS是一個強大的東西;不要害怕在打印文檔時隱藏側(cè)邊欄。即使沒有人打印過物理副本,你會驚奇的發(fā)現(xiàn)有多少開發(fā)者喜歡打印到PDF以供離線閱讀。

勘誤:原始的HTTP封包

因為我們所做的一切都是通過HTTP,我將向你展示一個HTTP包的剖析。 我經(jīng)常感到驚訝的是,有多少人不知道這些東西是什么樣子的! 當客戶端向服務(wù)器發(fā)送請求時,它們提供一組鍵/值對,稱為標題,以及兩個換行符,***是請求體。 這都是在同一個數(shù)據(jù)包中發(fā)送的。

服務(wù)器然后以所述鍵/值對格式,用兩個換行符然后響應(yīng)主體進行響應(yīng)。 HTTP是一個請求/響應(yīng)協(xié)議; 沒有“推送”支持(服務(wù)器向客戶端發(fā)送數(shù)據(jù)未經(jīng)安全),除非您使用不同的協(xié)議,如Websockets。

在設(shè)計API時,您應(yīng)該能夠使用允許查看原始HTTP數(shù)據(jù)包的工具。 例如,考慮使用Wireshark。 此外,請確保您使用的框架/ Web服務(wù)器,允許您閱讀和更改盡可能多的這些字段。

Example HTTP Request

POST /v1/animal HTTP/1.1
Host: api.example.org
Accept: application/json
Content-Type: application/json
Content-Length: 24

{   "name": "Gir",   "animal_type": 12 }

Example HTTP Response

HTTP/1.1 200 OK
Date: Wed, 18 Dec 2013 06:08:22 GMT
Content-Type: application/json
Access-Control-Max-Age: 1728000
Cache-Control: no-cache

{   "id": 12,   "created": 1386363036,   "modified": 1386363036,   "name": "Gir",   "animal_type": 12 }
責任編輯:張燕妮 來源: 知秋z
相關(guān)推薦

2013-06-13 09:21:31

RESTful APIRESTfulAPI

2024-09-03 08:24:52

RestfulAPI結(jié)構(gòu)

2019-11-13 11:52:46

區(qū)塊鏈API比特幣

2024-06-27 10:48:48

2020-07-10 07:48:19

REST APISDK提供商

2021-01-26 05:17:54

RESTfulAPI

2023-09-01 08:19:21

Flask

2023-05-15 09:14:38

2009-12-24 14:39:53

設(shè)計ADO.NET

2023-11-30 09:18:27

2022-01-24 09:00:00

機器學習決策樹算法

2022-04-21 14:03:54

開發(fā)API生命周期

2023-12-28 11:54:54

2024-07-26 21:55:39

RustRESTfulAPI

2021-04-02 12:37:53

RestfulAPI接口架構(gòu)

2017-03-13 14:09:19

RESTful API實踐

2013-07-01 11:01:22

API設(shè)計API

2022-05-13 08:17:05

HTTPRESTful架構(gòu)

2020-09-03 08:02:36

CDN降本P2P

2021-03-17 08:00:59

JS語言Javascript
點贊
收藏

51CTO技術(shù)棧公眾號

欧美疯狂party性派对| 日本不卡一区二区三区四区| 国产毛片视频网站| 日韩欧美亚洲视频| 中文字幕成人| 91小视频在线免费看| www.国产一区| 九九九九九九精品| 极品魔鬼身材女神啪啪精品| 亚洲日本天堂| 国产美女精品一区二区三区| 欧美一区二区三区视频在线| 日韩欧美一区二区三区四区五区| 激情综合网五月天| 91精品视频一区二区| 玉足女爽爽91| 成人网在线免费观看| www.黄色在线| 婷婷午夜社区一区| 97精品久久久午夜一区二区三区 | 日本精品久久久久久| 欧美少妇xxxx| 欧美三级xxx| 国产一区再线| 精品深夜av无码一区二区老年| 欧美日韩精品一区二区三区视频| gogo大胆日本视频一区| 欧美成人免费全部观看天天性色| 成年网站在线播放| 国产69精品久久app免费版| 91综合精品国产丝袜长腿久久| 国产片一区二区| 青青草99啪国产免费| 极品白嫩丰满美女无套| 草草在线观看| 大白屁股一区二区视频| 久久99精品久久久久久噜噜| 红桃视频一区二区三区免费| 国产视频一区二区| 国产在线播精品第三| 97视频国产在线| 欧美肉大捧一进一出免费视频| 欧美videosex性极品hd| 粉嫩蜜臀av国产精品网站| 欧美日韩第一视频| 99精品全国免费观看| 欧美激情三区| 国产精品成人免费| 1卡2卡3卡精品视频| 久操免费在线视频| 日韩精品免费一区二区三区| 欧美美女一区二区| 亚洲色婷婷久久精品av蜜桃| 丰满人妻一区二区| 国产亚洲高清视频| 亚洲女同性videos| 国产小视频精品| videos性欧美另类高清| 欧美韩国日本综合| 久久综合福利| 中文字幕在线观看高清| 1024精品久久久久久久久| 日韩欧美亚洲另类制服综合在线| 亚洲国产精品无码av| 丝袜+亚洲+另类+欧美+变态| 免费在线观看日韩欧美| 久精品免费视频| 国产中文av在线| 免费成人蒂法| 在线观看区一区二| www.99riav| 日韩av资源站| 极品少妇xxxx精品少妇| 欧美激情精品久久久久久大尺度 | 国产黄人亚洲片| 97婷婷涩涩精品一区| 久热这里只有精品在线| 黑丝一区二区三区| 亚洲女同性videos| 国产精品国产三级国产专业不 | 精品一区电影| 6080午夜不卡| av7777777| 午夜视频在线观看网站| yourporn久久国产精品| 国产精品theporn88| 无码人妻一区二区三区免费| 午夜国产精品视频免费体验区| 日韩精品在线免费播放| 国产性生活一级片| 神马久久资源| 欧美亚洲高清一区二区三区不卡| 亚洲国产精品无码av| av中文字幕电影在线看| 亚洲日本乱码在线观看| 欧美一级爱爱| 亚洲精品无码专区| 精品一区二区三区免费| 国产91亚洲精品| 免费人成在线观看| 国产精品毛片| 国产精品精品视频| 久草手机在线视频| 亚洲二区精品| 久久久精品免费视频| 午夜精产品一区二区在线观看的| 视频欧美一区| 欧美日韩成人一区| 久久精品午夜福利| sm在线播放| 在线视频国产一区| 久久综合在线观看| 思热99re视热频这里只精品| 欧美r级在线观看| 三级性生活视频| 欧美成人高清视频在线观看| 日韩欧美电影一二三| 久久精品国产亚洲AV熟女| 欧美成人一区在线观看| 在线看国产精品| 30一40一50老女人毛片| 色婷婷综合久久久久久| 日韩一区二区欧美| 国产黄色片视频| 亚洲国产美女| 国内精品久久久| 国产午夜精品一区二区理论影院| 欧美午夜精品| 久久久久久久久久av| 久久精品99国产精| 青青草国产成人99久久| 国产精品爱啪在线线免费观看| 国产美女裸体无遮挡免费视频| 捆绑变态av一区二区三区| 国产精品普通话| 在线视频你懂得| 韩国成人精品a∨在线观看| 精品无人乱码一区二区三区的优势| 欧美一级性视频| 亚洲欧美自拍偷拍| 91免费国产精品| 国产一区二区精品调教| 日韩av在线影院| xxxx日本免费| 亚洲九九精品| av蓝导航精品导航| 天天干天天爽天天操| 久久午夜老司机| 欧美在线播放一区| 欧美日韩在线观看首页| 欧美综合一区二区| 久久久久久久久免费看无码 | 波多野结衣一区二区三区在线观看| 番号集在线观看| 欧美三级免费观看| 蜜桃精品成人影片| 亚洲日本激情| 国产一区二区三区高清视频| 国产美女情趣调教h一区二区| 亚洲一区二区在线播放相泽| 精品视频在线观看一区| 欧美电影免费观看| 日韩成人av网| 国偷自拍第113页| 美腿丝袜亚洲综合| 日韩wuma| 国产福利91精品一区二区| 欧美一卡2卡3卡4卡| 很污很黄的网站| 伊人久久大香线蕉综合热线| 999国产视频| 污污视频在线| 一本大道久久a久久精品综合| 久久婷五月综合| 成人免费直播在线| 久久久久久久久久久免费精品| 成人av手机在线| 久久久久久麻豆| 免费观看黄色大片| 欧美欧美在线| 在线电影中文日韩| 特级西西444www高清大视频| 激情另类小说区图片区视频区| 亚洲高清在线观看一区| 啦啦啦中文在线观看日本| 精品久久99ma| 在线观看亚洲欧美| 中文字幕精品一区二区三区精品| 国产日韩亚洲欧美在线| 欧美va在线观看| 亚洲电影免费观看| 欧美日韩午夜视频| 丁香婷婷综合色啪| 国产精品视频一区二区三区四区五区| 国产精品一区二区三区四区在线观看| 亚洲精品网站在线播放gif| 日本视频免费观看| 国产精品久久久一本精品| 2022亚洲天堂| 国产欧美一区二区三区米奇| 美女啪啪无遮挡免费久久网站| 亚洲a视频在线| 激情成人中文字幕| 成人区人妻精品一区二| 欧美激情1区| 久久福利电影| 国产精品xnxxcom| 97精品久久久| 色欧美激情视频在线| 精品国精品国产| 超碰在线免费97| 一区二区三区精品| 波多野结衣网页| 国产精品婷婷| 国产欧美综合一区| 国产aⅴ精品一区二区四区| 国模视频一区二区| av网站无病毒在线| 欧美视频一区二区三区四区 | 国产精品无码av在线播放| 日韩国产一区二区三区| 国产精品久久久久久久小唯西川 | 久久成人av少妇免费| 男人天堂av片| 日韩激情在线| 久久久久久一区| 日韩一区二区三区色| 国产精品精品一区二区三区午夜版 | 亚洲精品大尺度| 国产一区二区视频在线观看免费| 日韩在线卡一卡二| 视频在线精品一区| 欧美性aaa| 欧美精品中文字幕一区| 成年网站在线| 欧美日韩1234| 国产精品国产三级国产专区52| 最新热久久免费视频| 免费看91的网站| 91最新地址在线播放| 永久看看免费大片| 亚洲精品专区| 天堂av在线中文| 成人精品电影| 日本免费高清不卡| 琪琪久久久久日韩精品| a级国产乱理论片在线观看99| 欧洲精品久久久久毛片完整版| 日韩暖暖在线视频| 综合日韩av| 91成人免费观看网站| 国产中文字幕在线视频| 欧美日韩免费不卡视频一区二区三区| 99久热在线精品996热是什么| 一区二区三区四区av| 91麻豆免费视频网站| 国产精品久久久久久久久免费相片| 三上悠亚ssⅰn939无码播放 | 国产精品日韩在线| 老司机2019福利精品视频导航 | 天堂资源在线| 国模视频一区二区| av今日在线| 高清一区二区三区四区五区| 日本资源在线| 欧美日韩xxxxx| 激情av在线| 韩日欧美一区二区| 中文不卡1区2区3区| 国产suv精品一区二区三区88区| 中文在线免费二区三区| 欧美一区第一页| h视频网站在线观看| 伊人伊人伊人久久| 日韩美女网站| 久久影视免费观看| 欧美日韩视频精品二区| 欧美一激情一区二区三区| 在线视频一区二区三区四区| 1024成人网| 91嫩草|国产丨精品入口| 亚洲欧美日韩久久精品| 久草资源在线视频| 天天射综合影视| 日韩综合在线观看| 在线播放中文一区| 性一交一乱一色一视频麻豆| 亚洲第一在线视频| 成年人在线观看网站| 欧美精品在线播放| 色一区二区三区| 国产精品丝袜一区二区三区| 在线免费av资源| 国产精品成人在线| 国产一区一区| 精品欧美日韩| 欧美日韩色图| 路边理发店露脸熟妇泻火| 亚洲国产高清一区| 黄色三级视频在线| 美女诱惑一区| 久久久久久人妻一区二区三区| 在线日本高清免费不卡| 亚洲精品视频导航| 成人小视频在线| 韩国三级hd中文字幕| 亚洲精品视频在线观看网站| 国产精品麻豆一区| 一区二区成人在线视频 | 欧美体内谢she精2性欧美| 中文字幕理论片| 精品日本一线二线三线不卡| 九色网友自拍视频手机在线| 久久综合免费视频影院| 成人免费看黄| 99久久精品免费看国产四区| 国产精品一区二区99| 精品视频高清无人区区二区三区| 久久免费大视频| 国产特级黄色大片| 韩国欧美一区二区| 国产精品扒开腿做爽爽| 亚洲综合在线五月| 亚洲视屏在线观看| 日韩电视剧免费观看网站| 哥也色在线视频| 欧美乱人伦中文字幕在线| 性欧美1819sex性高清| 国产成人成网站在线播放青青| 成人在线免费视频观看| 日本少妇高潮喷水视频| 国产成人在线视频网址| 国产精品久久国产精麻豆96堂| 精品福利樱桃av导航| 国产极品久久久| 日韩欧美在线不卡| 日本亚洲精品| 国产成人jvid在线播放| 免费一区二区三区四区| 久久www免费人成精品| 欧美视频久久| 激情在线观看视频| 国产精品夫妻自拍| 亚洲大尺度在线观看| 69久久99精品久久久久婷婷| 高清毛片在线看| 亲子乱一区二区三区电影| 国产精品巨作av| av片在线免费| 国产盗摄精品一区二区三区在线 | 亚洲肉体裸体xxxx137| 日韩性感在线| 国产精品一二| yy1111111| 国产日韩欧美高清| 麻豆视频在线免费看| 欧美美女直播网站| 麻豆传媒在线观看| 国产91av在线| 群体交乱之放荡娇妻一区二区| av免费看网址| 成人av网站免费观看| 老司机福利在线观看| 亚洲午夜精品在线| 亚洲av无码国产精品永久一区| 久久91亚洲精品中文字幕奶水| 精品一区二区三区亚洲| 免费看污污视频| 国产成人在线视频网址| 日韩乱码一区二区| 亚洲国产日韩一区| 亚洲日本天堂| 亚洲色图自拍| 国产亚洲激情| 精品人妻无码一区二区三区换脸| 色菇凉天天综合网| 粉嫩小泬无遮挡久久久久久| 久久久久久有精品国产| 奇米777国产一区国产二区| 国产av无码专区亚洲精品| 国产人伦精品一区二区| 亚洲图片在线播放| 久久国产精品偷| 国产91精品入| 日韩视频免费在线播放| 国产麻豆精品theporn| 久久黄色免费网站| 亚洲精品日韩丝袜精品| 黄色成人小视频| 欧美a级免费视频| 91丨九色丨蝌蚪丨老版| 五月婷婷激情五月| 久久久av免费| 久久精品66| 青青草国产免费| 久久久久久久综合色一本| 国产精品久久久久久久成人午夜| 亚洲欧美日韩国产中文专区| 激情欧美一区二区三区黑长吊| 成年在线观看视频|