作為客戶端萎战,首先要知道服務(wù)端都有哪些響應(yīng),響應(yīng)報文是什么舆逃,然后才知道響應(yīng)是否成功or失敗蚂维。
1. 服務(wù)端都有哪些響應(yīng)?
http響應(yīng)報文介紹如分割線下面路狮,響應(yīng)報文里狀態(tài)行中有響應(yīng)狀態(tài)碼虫啥,當(dāng)我(客戶端)收到服務(wù)端響應(yīng)時,要先判斷響應(yīng)狀態(tài)碼是什么然后做相應(yīng)處理奄妨。
1) 我收到服務(wù)器的響應(yīng)碼101涂籽,意味著服務(wù)器已按照我的要求切換為HTTP 1.1的協(xié)議,之后的請求和響應(yīng)按照切換后的協(xié)議通信展蒂。
2) 我收到服務(wù)器的響應(yīng)碼202又活,意味著服務(wù)器已接受請求,但尚未處理锰悼;緊接著可能會收到服務(wù)器響應(yīng)碼201柳骄,說明服務(wù)器已經(jīng)按照請求開始創(chuàng)建資源;最終會收到服務(wù)器響應(yīng)碼200箕般,服務(wù)器終于按照請求創(chuàng)建資源全部成功耐薯。有時也會收到響應(yīng)碼204,意味著服務(wù)器成功處理請求但無任何內(nèi)容返回。
當(dāng)收到響應(yīng)碼200后曲初,說明服務(wù)器已經(jīng)成功處理請求体谒,然后再判斷http響應(yīng)報文里響應(yīng)數(shù)據(jù)部分,數(shù)據(jù)中包含了資源創(chuàng)建的詳細(xì)信息臼婆,然后再根據(jù)響應(yīng)的詳細(xì)信息進(jìn)行接下來的處理抒痒。
響應(yīng)的消息體是在接口設(shè)計時考慮的,根據(jù)需求颁褂,可以設(shè)計消息是同步還是異步的故响,異步場景下異步超時時間,異步場景下操作的進(jìn)度颁独,操作的結(jié)果彩届,操作的詳細(xì)內(nèi)容。
收到響應(yīng)碼200后誓酒,解析響應(yīng)數(shù)據(jù):
場景1:消息同步樟蠕,同步情況下操作結(jié)果,操作的詳細(xì)內(nèi)容靠柑。
如果操作結(jié)果返回失敗則一次請求的響應(yīng)失斦纭;如果操作結(jié)果返回成功則一次請求的響應(yīng)成功病往;如果超過同步響應(yīng)時間捣染,則一次請求的響應(yīng)超時。
場景2:消息異步停巷,異步情況下jobid耍攘,異步情況下超時時間,異步情況下操作進(jìn)度畔勤,操作結(jié)果蕾各,操作的詳細(xì)內(nèi)容。
如果操作結(jié)果返回失敗則一次請求的響應(yīng)失敗庆揪,如果操作結(jié)果返回成功則一次請求的響應(yīng)成功式曲。如果超過一次請求和同一次響應(yīng)的時間,則一次請求的響應(yīng)超時缸榛。
在異步請求場景下吝羞,然后根據(jù)jobid進(jìn)行調(diào)用服務(wù)器查詢進(jìn)度,服務(wù)器一直響應(yīng)消息進(jìn)度内颗,直到操作結(jié)果為成功(操作進(jìn)度為100)钧排。如果操作結(jié)果返回失敗,不管進(jìn)度多少則多次請求的響應(yīng)失斁摹恨溜;如果操作結(jié)果返回成功符衔,則判斷進(jìn)度是否為100則多次請求的響應(yīng)成功;如果超過響應(yīng)的異步超時時間糟袁,則多次請求的響應(yīng)超時判族;如果超過一次請求和同一次響應(yīng)的時間,則一次請求的響應(yīng)超時项戴。
如何判斷收到的異步請求和異步調(diào)用進(jìn)度屬于同一個事物的操作形帮?
舉個栗子:A發(fā)起請求給B,B響應(yīng)異步消息肯尺,A發(fā)起請求給C沃缘,C也響應(yīng)異步消息躯枢。那么A通過IP/URL/port则吟,知道是發(fā)給B還是發(fā)給C。
但是如果A給B發(fā)了兩次不同類型的操作锄蹂,B都響應(yīng)異步消息氓仲,那么A如何區(qū)分是哪次操作呢?可以在每次的消息請求和響應(yīng)中添加操作類型的名稱得糜。
3)? 我收到服務(wù)器的響應(yīng)碼300(多種選擇)敬扛,意味著服務(wù)器針對發(fā)的請求,有多種操作供請求者選擇朝抖,我收到響應(yīng)后要選擇其中一種操作啥箭。我收到服務(wù)器響應(yīng)碼301(永久移動),則表示請求的網(wǎng)頁已經(jīng)永久移動到新位置并將新位置告知我治宣,以后再訪問就發(fā)請求給新位置急侥。我收到服務(wù)器響應(yīng)碼302(臨時移動),則表示請求的網(wǎng)頁只是臨時移到到新位置侮邀,并將新位置告知我坏怪,但只是臨時訪問以后還繼續(xù)訪問老位置。我收到服務(wù)器響應(yīng)碼304(網(wǎng)頁未變更)绊茧,則表示網(wǎng)頁未發(fā)生變更铝宵,不再返回網(wǎng)頁內(nèi)容。我收到服務(wù)器響應(yīng)碼305(客戶端使用代理訪問)华畏,則表示服務(wù)器允許我請求者使用代理方式訪問網(wǎng)頁鹏秋。我收到服務(wù)器響應(yīng)碼307(臨時重定向),則表示服務(wù)器讓我請求者臨時重定向訪問網(wǎng)頁亡笑,之后還是訪問原來位置侣夷。
響應(yīng)碼302和307是一樣的,那各自解決什么問題况芒?
? ? ? HTTP1.1協(xié)議中新加入307狀態(tài)碼惜纸。 HTTP1.1協(xié)議中的307狀態(tài)碼則相當(dāng)于HTTP1.0協(xié)議中的302狀態(tài)碼叶撒。當(dāng)客戶端的POST請求到收到服務(wù)端307狀態(tài)碼響應(yīng)時,需要跟用戶詢問是否應(yīng)該在新URI上發(fā)起POST方法耐版,也就是說祠够,307是不會把POST轉(zhuǎn)為GET的。
在HTTP1.1中粪牲,302理論上是要被放棄掉的古瓤,它被細(xì)化為303和307,但為了兼容腺阳,它目前還在業(yè)界中大量使用落君,而303和307狀態(tài)碼使用甚少。為什么業(yè)界少使用303和307呢亭引?對于GET和HEAD方法來說绎速,307是沒必要存在的,用302或者303就可以滿足需求了焙蚓,307僅在POST方法的重定向上有用處纹冤。
4)? 最悲催的事情是收到4xx的響應(yīng)碼,意味著請求可能錯誤购公,妨礙服務(wù)器處理萌京。
我收到服務(wù)器的響應(yīng)碼400(錯誤請求),意味著服務(wù)器不理解請求的語法宏浩。我收到服務(wù)器響應(yīng)碼401(未授權(quán))知残,意味著服務(wù)器驗證登錄者的身份失敗。我收到服務(wù)器響應(yīng)碼403(禁止)比庄,意味著服務(wù)器拒絕請求求妹。我收到服務(wù)器響應(yīng)碼404(未找到),意味著服務(wù)器找不到請求的網(wǎng)頁印蔗。我收到服務(wù)器響應(yīng)碼405(請求方法禁用)扒最,表示服務(wù)器禁止使用請求中的方法。我收到服務(wù)器響應(yīng)碼407(需要代理授權(quán))华嘹,表示服務(wù)器給我請求者指定授權(quán)的代理(與401類似但指定代理授權(quán))吧趣。我收到服務(wù)器響應(yīng)碼408(請求超時),意味著服務(wù)器等候請求時發(fā)生超時(服務(wù)器怎么知道超時時間耙厚?二者約定的强挫?)。我收到服務(wù)器響應(yīng)碼409(沖突)薛躬,表示服務(wù)器在完成請求時發(fā)生沖突俯渤,并將沖突信息放在響應(yīng)中。我收到服務(wù)器響應(yīng)碼410(已刪除)型宝,表示請求的資源已經(jīng)永久刪除八匠。我收到服務(wù)器響應(yīng)碼411(有效內(nèi)容長度標(biāo)頭字段)絮爷,表示服務(wù)器不接收不含有效內(nèi)容長度標(biāo)頭字段的請求。
412(服務(wù)器未滿足請求者在請求中設(shè)置的一個前提條件)梨树,413(請求實體過大坑夯,服務(wù)器無法處理),414(請求的URI過長)抡四。
5) 收到5xx的響應(yīng)碼柜蜈,說明服務(wù)器內(nèi)部出錯,而不是請求出錯指巡。
500是服務(wù)器內(nèi)部出錯淑履,無法完成請求。
503表示服務(wù)器目前無法使用(由于超載或停機(jī)維護(hù))藻雪。
505服務(wù)器不支持請求中所用的HTTP協(xié)議版本秘噪。
2. HTTP響應(yīng)報文
? ? ? 一個http響應(yīng)報文由狀態(tài)行<status-line>、響應(yīng)頭部<headers>阔涉、空行<blank-line>和響應(yīng)數(shù)據(jù)<response-body>4個部分組成缆娃。
1)狀態(tài)行: 由HTTP協(xié)議版本、服務(wù)器返回的響應(yīng)狀態(tài)碼和響應(yīng)狀態(tài)碼的文本描述組成瑰排。
2)響應(yīng)頭部:由關(guān)鍵字/值對組成,每行一對暖侨,關(guān)鍵字和值用英文冒號”:“分隔椭住,典型的響應(yīng)頭有:
? ? ? ? ? Location:用于重定向接受者到一個新的位置。例如:客戶端所請求的頁面已不存在原先的位置字逗,為了讓客戶端重定向到這個頁面新的位置京郑,服務(wù)器端可以發(fā)回Location響應(yīng)報頭后使用重定向語句,讓客戶端去訪問新的域名所對應(yīng)的服務(wù)器上的資源
? ? ? ? ? Server:包含了服務(wù)器用來處理請求的軟件信息及其版本葫掉。它和 User-Agent 請求報頭域是相對應(yīng)的些举,前者發(fā)送服務(wù)器端軟件的信息,后者發(fā)送客戶端軟件(瀏覽器)和操作系統(tǒng)的信息
? ? ? ? ? Vary:指示不可緩存的請求頭列表
? ? ? ? ? Connection:連接方式
對于請求來說:
? ? ? close(告訴 WEB 服務(wù)器或者代理服務(wù)器俭厚,在完成本次請求的響應(yīng)后户魏,斷開連接,不等待本次連接的后續(xù)請求了)挪挤。
? ? ? keepalive(告訴WEB服務(wù)器或者代理服務(wù)器叼丑,在完成本次請求的響應(yīng)后,保持連接扛门,等待本次連接的后續(xù)請求);
對于響應(yīng)來說:
? ? ? ? close(連接已經(jīng)關(guān)閉);
? ? ? ? keepalive(連接保持著鸠信,在等待本次連接的后續(xù)請求);
? ? ? ? Keep-Alive:如果瀏覽器請求保持連接,則該頭部表明希望WEB 服務(wù)器保持連接多長時間(秒);例如:Keep-Alive:300;
? WWW-Authenticate:必須被包含在401 (未授權(quán)的)響應(yīng)消息中论寨,這個報頭域和前面講到的Authorization 請求報頭域是相關(guān)的星立,當(dāng)客戶端收到 401 響應(yīng)消息爽茴,就要決定是否請求服務(wù)器對其進(jìn)行驗證。如果要求服務(wù)器對其進(jìn)行驗證绰垂,就可以發(fā)送一個包含了Authorization 報頭域的請求
? ? 3)空行:最后一個響應(yīng)頭部之后是一個空行闹啦,發(fā)送回車符和換行符,通知瀏覽器以下不再有響應(yīng)頭部辕坝。
? ? 4)響應(yīng)數(shù)據(jù):服務(wù)器返回給客戶端的文本信息窍奋。
響應(yīng)報文示例:
HTTP/1.1 301 Moved Permanently
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Location: <a target=_blank >HTTP://www.facebook.com/</a>
P3P: CP=”DSP LAW”
Pragma: no-cache
Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;
path=/; domain=.facebook.com; httponly
Content-Type: text/html; charset=utf-8
X-Cnection: close
Date: Fri, 12 Feb 2010 05:09:51 GMT
Content-Length: 0
3.一次請求的響應(yīng)是否成功
要想知道一次請求的響應(yīng)是否成功,要分析下響應(yīng)的報文(消息體)酱畅。
1) 首先響應(yīng)報文里狀態(tài)行中有響應(yīng)狀態(tài)碼琳袄,當(dāng)我(客戶端)收到服務(wù)端響應(yīng)時,要先判斷響應(yīng)狀態(tài)碼是什么然后做相應(yīng)處理纺酸。
收到狀態(tài)響應(yīng)碼200窖逗,說明服務(wù)器已經(jīng)成功處理請求;
2) 然后再判斷http響應(yīng)報文里響應(yīng)數(shù)據(jù)部分餐蔬,數(shù)據(jù)中包含了資源創(chuàng)建的詳細(xì)信息碎紊,然后再根據(jù)響應(yīng)的詳細(xì)信息進(jìn)行接下來的處理。
響應(yīng)的消息體是在接口設(shè)計時考慮的樊诺,根據(jù)需求仗考,可以設(shè)計消息是同步還是異步的,異步場景下異步超時時間词爬,異步場景下操作的進(jìn)度秃嗜,操作的結(jié)果,操作的詳細(xì)內(nèi)容顿膨。
收到響應(yīng)碼200后锅锨,解析響應(yīng)數(shù)據(jù):
場景1:消息同步,同步情況下操作結(jié)果恋沃,操作的詳細(xì)內(nèi)容必搞。
操作結(jié)果返回成功則一次請求的響應(yīng)成功。
場景2:消息異步囊咏,異步情況下jobid恕洲,異步情況下超時時間,異步情況下操作進(jìn)度匆笤,操作結(jié)果研侣,操作的詳細(xì)內(nèi)容。
操作結(jié)果返回成功則一次請求的響應(yīng)成功炮捧。在異步請求場景下庶诡,然后根據(jù)jobid進(jìn)行調(diào)用服務(wù)器查詢進(jìn)度,服務(wù)器一直響應(yīng)消息進(jìn)度咆课,直到操作結(jié)果為成功(操作進(jìn)度為100)末誓。
4 . 一次請求的響應(yīng)是否失敗
分析略扯俱,詳見第一部分內(nèi)容。