1、HTTP 基礎(chǔ)
當(dāng)您開發(fā)服務(wù)器或客戶端應(yīng)用程序時(shí),您很有可能通過HTTP執(zhí)行API請(qǐng)求。HTTP(超文本傳輸協(xié)議)是用于萬(wàn)維網(wǎng)(WWW)的應(yīng)用級(jí)通信的標(biāo)準(zhǔn)化協(xié)議嫉晶。
HTTP基于請(qǐng)求和響應(yīng)。對(duì)于本教程田篇,Android應(yīng)用程序?qū)⒆鳛榭蛻舳耍⑾蚍?wù)器發(fā)送請(qǐng)求箍铭,該服務(wù)器將發(fā)回響應(yīng)泊柬。要在服務(wù)器上請(qǐng)求的資源的標(biāo)識(shí)符始終使用URL(統(tǒng)一資源定位符)。URL的方案表示您是加密(例如诈火,https)通信(例如兽赁,http)。
2冷守、客戶端請(qǐng)求
Android應(yīng)用程序向服務(wù)器發(fā)送請(qǐng)求刀崖。請(qǐng)求包含四個(gè)主要部分:
a、Request line(請(qǐng)求的URL地址)
b拍摇、Request headers(請(qǐng)求頭(可選))
c亮钦、Empty line to separate headers and body(空的URL去分離header和body)
d、Request body(請(qǐng)求體(可選))
下面充活,我們將詳細(xì)介紹這幾部分蜂莉。
① Request line
請(qǐng)求的第一部分是request line蜡娶。它包含兩條信息:請(qǐng)求方法和請(qǐng)求URL。我們將在下面研究請(qǐng)求方法∮乘耄現(xiàn)在我們以GET為例窖张,這意味著客戶端不發(fā)送數(shù)據(jù),只是詢問服務(wù)器的一些信息蚁滋。服務(wù)器根據(jù)傳遞的請(qǐng)求URL知道客戶端要求的資源宿接。
例如:
GET https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505107071654&di=f874b2d2bf8d1d78bbfc5ae0d9aeb488&imgtype=0&src=http%3A%2F%2Fpic7.nipic.com%2F20100514%2F2158700_153225558098_2.jpg
上面的代碼是一個(gè)有效的請(qǐng)求,要求服務(wù)器返回一張圖片辕录。
② Request Headers
有時(shí)睦霎,服務(wù)器需要更多的信息,而不僅僅是請(qǐng)求方法和資源位置踏拜。例如碎赢,很多服務(wù)器實(shí)現(xiàn)支持各種客戶端。以前速梗,我們開展過一個(gè)項(xiàng)目肮塞,服務(wù)器根據(jù)客戶端是Android或IOS應(yīng)用程序,發(fā)送不同的回復(fù)姻锁。但服務(wù)器如何知道是什么樣的應(yīng)用程序請(qǐng)求資源枕赵?請(qǐng)求頭!沒錯(cuò)位隶,就是請(qǐng)求頭拷窜!請(qǐng)求頭是用于附加數(shù)據(jù)補(bǔ)充請(qǐng)求的一種方式,它們被構(gòu)造為簡(jiǎn)單的基于文本的鍵值數(shù)組涧黄。在上面的示例中篮昧,Android應(yīng)用程序?qū)⑻砑右粋€(gè)用戶代理:Android 頭,從而將自己標(biāo)識(shí)給服務(wù)器笋妥。還有更多的標(biāo)準(zhǔn)header懊昨,甚至更多的自定義header,您可以根據(jù)您的應(yīng)用程序進(jìn)行開發(fā)春宣。重要的是要知道header在創(chuàng)建一個(gè)干凈的應(yīng)用程序和減少在請(qǐng)求URL或請(qǐng)求正文中發(fā)送的數(shù)據(jù)量非常有用酵颁。
③ Request Body
與header不同,請(qǐng)求體支持各種格式的復(fù)雜數(shù)據(jù)結(jié)構(gòu)月帝。通用數(shù)據(jù)格式是JSON躏惋,XML或二進(jìn)制格式。請(qǐng)求體通常包含消息的重要部分嚷辅。例如簿姨,如果客戶端將向服務(wù)器發(fā)出創(chuàng)建新用戶的請(qǐng)求,則請(qǐng)求主體將包含用戶的信息(名稱簸搞,地址款熬,...)深寥。
3、Request Methods(請(qǐng)求方式)
您已經(jīng)知道了請(qǐng)求的第一部分是請(qǐng)求方法贤牛,如GET惋鹅。這并不是偶然的,根據(jù)請(qǐng)求方式請(qǐng)求的性質(zhì)可能完全不同殉簸。
GET https://baidu.com/api/user/42
DELETE https:/baidu.com/api/user/42
例如闰集,上面的請(qǐng)求幾乎是相同的。然后般卑,第一個(gè)將請(qǐng)求用戶42的數(shù)據(jù)武鲁,而第二個(gè)將刪除它!因此蝠检,請(qǐng)仔細(xì)處理請(qǐng)求方法沐鼠。
① GET
正如我們多次提到的,GET請(qǐng)求方法向服務(wù)器請(qǐng)求客戶端要訪問哪些數(shù)據(jù)叹谁。這是一個(gè)簡(jiǎn)單的閱讀饲梭,它不會(huì)添加,更改或刪除它焰檩。
② POST&PUT
POST和PUT都是將數(shù)據(jù)發(fā)送到服務(wù)器的方式憔涉。但是,其含義是不同的析苫。POST請(qǐng)求期望服務(wù)器將其添加到現(xiàn)有的兜叨。例如,具有用戶對(duì)象的POST請(qǐng)求意味著服務(wù)器創(chuàng)建一個(gè)新賬戶衩侥。另一方面国旷,PUT請(qǐng)求期望服務(wù)器更新或替換現(xiàn)有的數(shù)據(jù)項(xiàng)。因此茫死,如果有人更新自己的配置文件跪但,則具有用戶對(duì)象的PUT請(qǐng)求將是適合的。
③ DELETE
最后璧榄,也是最簡(jiǎn)單的一個(gè)DELETE。如果要?jiǎng)h除您在請(qǐng)求URL中指定的數(shù)據(jù)項(xiàng)吧雹,則使用DELETE骨杂。總體而言雄卷,您可能會(huì)認(rèn)識(shí)到GET搓蚪,POST,PUT丁鹉,DELETE與許多數(shù)據(jù)庫(kù)的CRUD模型非常相似妒潭。GET等于讀取悴能,POST正在創(chuàng)建一新的數(shù)據(jù)項(xiàng),PUT正在編輯雳灾,DELETE是刪除漠酿。
4、HEAD, PATCH, TRACE, OPTIONS, CONNECT
在絕大多數(shù)API中谎亩,您可以編輯或交互炒嘲,這四個(gè)請(qǐng)求方法將足夠。然而匈庭,在有些罕見的情況下夫凸,另一種請(qǐng)求方法可能更適合。由于它們超出了本教程的介紹性質(zhì)阱持,建議大家稍后閱讀特殊請(qǐng)求方法夭拌。最后,希望大家遵循請(qǐng)求方式標(biāo)準(zhǔn)衷咽。在大多數(shù)情況下鸽扁,客戶端,服務(wù)器和開發(fā)人員都更容易遵循通用的請(qǐng)求方法兵罢。
5献烦、Server Responses(服務(wù)器響應(yīng))
在上一節(jié)中,我們僅查看了客戶端-服務(wù)器交互的前半部分卖词。當(dāng)然巩那,服務(wù)器的響應(yīng)也很重要。響應(yīng)的結(jié)構(gòu)也與請(qǐng)求略有不同此蜈。它通常包含四個(gè)部分:
a即横、Status line(包括狀態(tài)碼和文本描述)
b、Response headers (響應(yīng)頭(可選))
c裆赵、Empty line to separate headers and body(空的URL去分離header和body)
d东囚、Response body(響應(yīng)體(可選))
雖然響應(yīng)頭和響應(yīng)體的結(jié)構(gòu)與請(qǐng)求的對(duì)應(yīng)關(guān)系相同,但是第一行實(shí)現(xiàn)的是完全不同的功能战授。狀態(tài)碼通知客戶請(qǐng)求的結(jié)果页藻。換句話說,它告訴你你的請(qǐng)求是否成功植兰。當(dāng)然份帐,取決于內(nèi)容,有一百萬(wàn)中不同的結(jié)果楣导。因此狀態(tài)行分為兩部分:狀態(tài)碼和文本描述废境。文本不遵守任何標(biāo)準(zhǔn)化,可以是描述成功或錯(cuò)誤的任何字符串。然而噩凹,狀態(tài)碼會(huì)以預(yù)期的方式行事巴元。接下來(lái)我們?cè)僭敿?xì)了解它們。
① Status Codes(狀態(tài)代碼)
如上面所了解的驮宴,狀態(tài)碼和文本描述由服務(wù)器設(shè)置逮刨,并作為服務(wù)器響應(yīng)的第一行發(fā)送』米客戶端將使用這一行來(lái)快速了解服務(wù)器發(fā)送什么樣的響應(yīng)禀忆。我們來(lái)看一些狀態(tài)碼的示例:
200 OK
204 No Content
401 Unauthorized
503 Service Unavailable
第一部分,數(shù)字狀態(tài)碼包含3個(gè)數(shù)字落恼。這些數(shù)字被分成幾百個(gè)箩退,我們將在下面了解它們。
a佳谦、1xx Informational
雖然存在1xx的狀態(tài)碼戴涝,但它們通常用于更低級(jí)別的東西,而且您很可能在現(xiàn)實(shí)中不用去處理它們钻蔑。
b啥刻、2xx Success
希望您最多使用這些狀態(tài)碼。以2開頭的所有狀態(tài)碼表示請(qǐng)求成功咪笑。
幾個(gè)重要的2xx狀態(tài)碼:
- 200 OK - 用于指示成功請(qǐng)求的標(biāo)準(zhǔn)響應(yīng)可帽。可惜的是窗怒,許多API專門使用這個(gè)API映跟,不會(huì)將成功分解成其他2xx狀態(tài)碼。
- 201創(chuàng)建 - 請(qǐng)求成功導(dǎo)致創(chuàng)建新的東西扬虚。
- 204無(wú)內(nèi)容 - 請(qǐng)求成功努隙,但服務(wù)器沒有響應(yīng)任何數(shù)據(jù)。這通常用于確認(rèn)資源的成功刪除辜昵。
c荸镊、3xx Redirect(重定向)
3xx組中的狀態(tài)碼都表示指定的URL不是正在或永久地服務(wù)于服務(wù)器,會(huì)在其他地方指示您的請(qǐng)求堪置。這主要用于Web服務(wù)器躬存,那些傳遞網(wǎng)頁(yè)和較少的API。
d舀锨、4xx Client Error
希望您沒有經(jīng)常要去處理4xx組中的狀態(tài)碼岭洲。他們表示請(qǐng)求的形式不正確,服務(wù)器無(wú)法處理雁竞。會(huì)有一些技術(shù)原因钦椭,為什么會(huì)發(fā)生這種情況,例如碑诉,請(qǐng)求對(duì)服務(wù)器來(lái)說太大彪腔。但是,通常进栽,請(qǐng)求的參數(shù)是有問題的德挣。
幾個(gè)常見的4xx狀態(tài)碼:
- 400錯(cuò)誤請(qǐng)求 - 與2xx狀態(tài)碼類似,這是所有類型的錯(cuò)誤的統(tǒng)稱快毛。一些API專門使用它格嗅,這使得客戶端很難理解錯(cuò)誤。理想情況下唠帝,如果服務(wù)器的請(qǐng)求以某種不正確的形式(丟失數(shù)據(jù)屯掖,數(shù)據(jù)違反輸入約束,...)襟衰,則服務(wù)器只400狀態(tài)碼贴铜,并在響應(yīng)主體中更詳細(xì)地指定錯(cuò)誤。
- 401未經(jīng)授權(quán) - 此狀態(tài)碼對(duì)請(qǐng)求的內(nèi)容沒有任何說明瀑晒,它告訴您無(wú)法處理請(qǐng)求绍坝,因?yàn)榉?wù)器無(wú)法驗(yàn)證請(qǐng)求(不知道請(qǐng)求后面的用戶是誰(shuí))。通常苔悦,這意味著認(rèn)證令牌丟失或不正確轩褐。
- 403禁止 - 通常與401混淆,但是這里的服務(wù)器知道請(qǐng)求發(fā)件人是誰(shuí)玖详,但不允許該操作把介。例如,用戶可以發(fā)送刪除另一個(gè)用戶的請(qǐng)求竹宋,但是需要管理員訪問權(quán)限劳澄。
- 404未找到 - 您在瀏覽網(wǎng)頁(yè)時(shí)會(huì)時(shí)常看到這個(gè)蜈七。它也可以用于API秒拔。如果客戶端嘗試訪問不存在的內(nèi)容(應(yīng)該會(huì)收到)。
e飒硅、5xx Server Error
最后的5xx組狀態(tài)碼特別麻煩砂缩。這些表示服務(wù)器有問題,無(wú)法處理您的請(qǐng)求三娩。如果您是服務(wù)器開發(fā)人員庵芭,這些錯(cuò)誤是您應(yīng)該注意的。如果您是客戶端開發(fā)人員雀监。您也應(yīng)該尋找他們双吆,并立即向API人員報(bào)告眨唬。
最常用的5xx狀態(tài)碼是:
- 500內(nèi)部服務(wù)器錯(cuò)誤 - 捕獲所有因?yàn)楦鞣N原因,無(wú)法在服務(wù)器端處理請(qǐng)求好乐。通常提示錯(cuò)誤或錯(cuò)誤配置匾竿。
- 503服務(wù)不可用 - 這意味著服務(wù)器出現(xiàn)了問題。
總結(jié)
在這篇文章中岭妖,您已經(jīng)看到了HTTP及其元素的概述反璃。希望本教程為您提供了一個(gè)開始和一些資源,以便在必要時(shí)進(jìn)一步閱讀更多詳細(xì)信息斋攀。