HTTP 基本知識(shí)

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ì)信息斋攀。

快樂工作梧田,享受編程!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肖方,一起剝皮案震驚了整個(gè)濱河市未状,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌司草,老刑警劉巖埋虹,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胰柑,居然都是意外死亡爬泥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門踩官,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)境输,“玉大人颖系,你說我怎么就攤上這事辩越。” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵亏钩,是天一觀的道長(zhǎng)欺旧。 經(jīng)常有香客問我,道長(zhǎng)栅哀,這世上最難降的妖魔是什么称龙? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮痴柔,結(jié)果婚禮上疫向,老公的妹妹穿的比我還像新娘。我一直安慰自己谈火,他們只是感情好舌涨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谍肤,像睡著了一般哗伯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上系任,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天俩滥,我揣著相機(jī)與錄音,去河邊找鬼霜旧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛以清,可吹牛的內(nèi)容都是我干的崎逃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巴柿!你這毒婦竟也來(lái)了澄峰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓦阐,失蹤者是張志新(化名)和其女友劉穎篷牌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戳杀,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡信卡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年题造,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了界赔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牵触。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揽思,死狀恐怖见擦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情损痰,我是刑警寧澤执俩,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布癌刽,位于F島的核電站显拜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矮固。R本人自食惡果不足惜譬淳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一邻梆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尼摹,春花似錦剂娄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怠缸,卻和暖如春钳宪,著一層夾襖步出監(jiān)牢的瞬間吏颖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呆奕,地道東北人衬吆。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓逊抡,卻偏偏與公主長(zhǎng)得像冒嫡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子潜秋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容