HTTP

HTTP狀態(tài)碼分類

1xx:信息

2xx:請(qǐng)求成功

3xx:重定向

4xx:客戶端錯(cuò)誤

5xx:服務(wù)器錯(cuò)誤

常見的HTTP狀態(tài)碼

301:永久重定向

302:臨時(shí)重定向

400:客戶端請(qǐng)求語(yǔ)法錯(cuò)誤瞒渠,服務(wù)端無(wú)法理解(Bad Request)

401:請(qǐng)求未經(jīng)授權(quán)设易,客戶端需要進(jìn)行身份認(rèn)證(UnAuthorized)

403:客戶端無(wú)權(quán)限訪問犯建,服務(wù)端拒絕提供服務(wù)(Forbidden)

404:客戶端請(qǐng)求資源不存在,未找到請(qǐng)求的URL(NOT FOUND)券膀,例如輸錯(cuò)了URL

500:服務(wù)器遇到了錯(cuò)誤,無(wú)法為請(qǐng)求提供服務(wù)

503:服務(wù)器目前無(wú)法為客戶端的請(qǐng)求提供服務(wù)驯遇,但過(guò)一段時(shí)間就可以恢復(fù)服務(wù)

HTTP報(bào)文類型

HTTP請(qǐng)求報(bào)文:請(qǐng)求行芹彬、請(qǐng)求報(bào)頭、空行叉庐、請(qǐng)求體

HTTP響應(yīng)報(bào)文:狀態(tài)行舒帮、響應(yīng)報(bào)頭、空行陡叠、響應(yīng)體

請(qǐng)求行和狀態(tài)行

請(qǐng)求行:請(qǐng)求方法 + 請(qǐng)求URI + 請(qǐng)求的HTTP協(xié)議版本
eg:GET? http://www.baidu.com? HTTP/1.1

狀態(tài)行:服務(wù)器的HTTP協(xié)議版本 + 響應(yīng)狀態(tài)碼 + 狀態(tài)碼的文本描述
eg:HTTP/1.1? 200? OK

HTTP消息報(bào)頭

通用報(bào)頭

Date:表示消息產(chǎn)生的日期和時(shí)間
Connection:允許客戶端和服務(wù)器指定與請(qǐng)求/響應(yīng)連接有關(guān)的選項(xiàng)玩郊,如設(shè)置為Keep-Alive保持長(zhǎng)連接
Cache-Control:指定緩存指令

請(qǐng)求報(bào)頭

Host:請(qǐng)求的主機(jī)名
User-Agent:發(fā)送請(qǐng)求的瀏覽器類型、操作系統(tǒng)等信息
Accept:客戶端可識(shí)別的數(shù)據(jù)類型枉阵,用于指定客戶端允許接收哪些類型的信息
AcceptEncoding:客戶端可識(shí)別的數(shù)據(jù)編碼译红,如設(shè)置為Gzip表示支持透明壓縮
Transfer-Encoding:指定傳輸報(bào)文的編碼方式

響應(yīng)報(bào)頭

Location:重定向
Server:服務(wù)器的操作系統(tǒng)等信息

實(shí)體報(bào)頭

Content-Type:請(qǐng)求數(shù)據(jù)的數(shù)據(jù)類型(text/html、image/gif兴溜、application/xml等? )
Content-Length:實(shí)體正文的長(zhǎng)度
Content-Language:描述的自然語(yǔ)言
Content-Encoding:用于媒體類型的編碼
Expired:響應(yīng)過(guò)期的日期和時(shí)間

URLConnection

URLConnection是一個(gè)抽象類临庇,表示指向URL指定資源的連接。與URL類相比昵慌,URLConnection類對(duì)與HTTP服務(wù)器的交互提供了更多的控制:

1假夺、URLConnection可以訪問服務(wù)器響應(yīng)的首部信息
2、URLConnection可以設(shè)置客戶端請(qǐng)求的首部信息
3斋攀、URLConnection除了能讀取服務(wù)器響應(yīng)的數(shù)據(jù)外已卷,還能向服務(wù)器寫入數(shù)據(jù)

使用URLConnection的步驟:

1、構(gòu)造一個(gè)URL對(duì)象淳蔼;
2侧蘸、調(diào)用URL對(duì)象的openConnection()方法獲取一個(gè)URLConnection對(duì)象裁眯;
3、對(duì)URLConnection進(jìn)行配置(如果默認(rèn)配置則直接跳過(guò)此步驟)讳癌;
4穿稳、讀取首部字段(如果服務(wù)器沒有返回首部字段則直接跳過(guò)此步驟);
5晌坤、調(diào)用URLConnection對(duì)象的getInputStream()方法獲取輸入流并讀取數(shù)據(jù)逢艘;
6、調(diào)用URLConnection對(duì)象的getOutputStream()方法獲取輸出流并寫入數(shù)據(jù)骤菠;
7它改、關(guān)閉連接;

URLConnection類真正進(jìn)行連接的方法:

URLConnection類為抽象類商乎,不過(guò)除了connect()方法之外央拖,其它方法均已實(shí)現(xiàn),所以子類必須實(shí)現(xiàn)connect()方法鹉戚。該方法真正起到建立與服務(wù)器連接的作用鲜戒,因而依賴于服務(wù)類型(HTTP、FTP等)抹凳。第一次構(gòu)造URLConnection是袍啡,它是未連接的,本地和遠(yuǎn)程主機(jī)無(wú)法發(fā)送和接受數(shù)據(jù)却桶,必須等到connect()方法被調(diào)用境输,在本地和遠(yuǎn)程主機(jī)之間建立一個(gè)連接(一般是TCP Socket連接),才能真正收發(fā)數(shù)據(jù)颖系。當(dāng)getInputStream()嗅剖、getOutputStream()方法、讀取首部方法被調(diào)用時(shí)會(huì)自動(dòng)調(diào)用connect()方法嘁扼,所以一般不用顯示調(diào)用connect()進(jìn)行連接信粮。

讀取HTTP首部的方法:

1、getContentType():讀取Content-Type字段趁啸,該方法返回響應(yīng)主體的MIME內(nèi)容類型强缘,如果服務(wù)器沒有返回內(nèi)容類型,則返回null不傅。由于該方法返回的Content-Type字段通常包含字符編碼集旅掂,所以可以通過(guò)讀取HTTP首部中指定的編碼方式對(duì)文檔進(jìn)行解碼,如果沒有指定編碼方式访娶,則使用ISO-8859-1(HTTP的默認(rèn)編碼方式)

2商虐、getContentLength():讀取Content-Length字段,該方法返回響應(yīng)主體內(nèi)容的字節(jié)數(shù),如果服務(wù)器沒有返回內(nèi)容長(zhǎng)度秘车,則返回-1典勇。如果要下載一個(gè)二進(jìn)制文件,更可靠的做法是通過(guò)getContentLength()得到文件的長(zhǎng)度叮趴,然后根據(jù)這個(gè)文件的長(zhǎng)度讀取相應(yīng)的字節(jié)數(shù)割笙,避免出現(xiàn)HTTP服務(wù)器并不總是會(huì)在數(shù)據(jù)發(fā)送完成之后就立即關(guān)閉連接而導(dǎo)致不知何時(shí)停止讀取的情況

3、getContentEncoding():讀取Content-Encoding字段眯亦,該方法返回響應(yīng)主體的內(nèi)容編碼方式伤溉,如果沒有返回編碼方式,則返回null搔驼。最常用的編碼方式是Gzip谈火,可以使用GZIPInputStream類直接解碼

4侈询、getDate():讀取Date字段舌涨,該方法返回一個(gè)long類型,指出響應(yīng)發(fā)送的時(shí)間(服務(wù)器的時(shí)間)扔字,如果沒有返回發(fā)送時(shí)間囊嘉,則返回0「镂可以把long類型轉(zhuǎn)換為java.util.Date類型

5扭粱、getExpiration():讀取Expires字段,該方法返回一個(gè)long類型震檩,指出響應(yīng)數(shù)據(jù)的過(guò)期時(shí)間(服務(wù)器的時(shí)間)琢蛤,如果沒有返回過(guò)期時(shí)間,則返回0表示不會(huì)過(guò)期抛虏。該字段最常用來(lái)指示應(yīng)當(dāng)何時(shí)刪除緩存中的數(shù)據(jù)博其,并且從服務(wù)器下載最新的數(shù)據(jù)

6、getLastModified():讀取Last-Modified字段迂猴,該方法返回一個(gè)long類型慕淡,指出響應(yīng)主體返回?cái)?shù)據(jù)的最后修改日期,如果沒有返回最后修改日期沸毁,則返回0,峰髓。

7、getHeaderField(String name):返回指定首部字段的值息尺,首部字段不區(qū)分大小寫携兵,返回的是String類型,如果是獲取時(shí)間的話可以將String轉(zhuǎn)化為long或int值搂誉。

8眉孩、getHeaderField(int n):返回第n個(gè)首部字段的值,注意請(qǐng)求行和狀態(tài)行表示第0個(gè)首部字段。如在HTTP響應(yīng)中g(shù)etHeaderField(0)表示狀態(tài)行:HTTP/1.1 200 OK

涉及緩存的首部字段:

默認(rèn)情況下浪汪,一般認(rèn)為使用GET通過(guò)HTTP訪問的頁(yè)面可以緩存巴柿,主要涉及四個(gè)字段:

1、Expires:指定緩存過(guò)期的時(shí)間死遭;
2广恢、Cache-Control:指定緩存策略;
3呀潭、Last-Modified:指示資源最后一次修改時(shí)間钉迷;
4、Etag:資源改變時(shí)這個(gè)資源的唯一標(biāo)識(shí)符钠署;

客戶端緩存的策略:

1糠聪、如果本地緩存中這個(gè)資源的一個(gè)表示,而且還沒有到它的過(guò)期時(shí)間谐鼎,那么可以直接從本地緩存中讀取這個(gè)資源舰蟆,而無(wú)需與服務(wù)器交互;
2狸棍、如果本地緩存中這個(gè)資源的一個(gè)表示身害,不過(guò)它已經(jīng)過(guò)期了,在完成完整的GET之前草戈,可以檢查服務(wù)器的HEAD首部塌鸯,查看資源是否已經(jīng)改變;

URLConnection連接配置:

URLConnection類有7個(gè)受保護(hù)的實(shí)例字段唐片,定義了客戶端如何向服務(wù)器發(fā)起請(qǐng)求丙猬,這些字段都提供了相應(yīng)的get/set方法:

protected URL url? ? 指定了URLConnection連接的Url
protected boolean doInput = true? ? 讀取服務(wù)器
protected boolean doOutput = false? ? 寫入服務(wù)器
protected boolean allowUserInteraction = false????是否需要與用戶交互
protected boolean useCaches = true? ? 是否開啟緩存
protected long ifModifiedSince = 0? ? 客戶端最后獲取數(shù)據(jù)的時(shí)間
protected boolean connected = false? ? 連接的狀態(tài)

注意只能在URLConnection連接之前設(shè)置這些字段(試圖從連接讀取內(nèi)容或首部之前),如果設(shè)置時(shí)連接已經(jīng)打開费韭,則會(huì)拋出IllegalStateException異常茧球。在向服務(wù)器寫入數(shù)據(jù)時(shí),必須調(diào)用setDoOutput(true)方法置為true揽思。

另外有四個(gè)方法可以設(shè)置超時(shí)值袜腥,分別是控制Socket等待建立連接的超時(shí)時(shí)間,控制輸入流等待數(shù)據(jù)到達(dá)的超時(shí)時(shí)間:

public void setConnectTimeout(int timeout)
public void setReadTimeout(int timeout)

URLConnection配置HTTP請(qǐng)求首部:

public void setRequestProperty(String key, String value)? ? 設(shè)置首部字段(會(huì)覆蓋)
public void addRequestProperty(String key, String value)? ? 添加首部字段
public String getRequestProperty(String key)? ? 獲取指定首部字段的值
public Map<String,List<String>> getRequestProperties()? ? 獲取全部首部字段值


HTTPURLConnection

HTTPURLConnection類是URLConnection的抽象子類钉汗,它對(duì)URLConnection進(jìn)行了功能擴(kuò)展羹令,提供了另一些方法在處理HTTP時(shí)很有用。具體的功能擴(kuò)展為:

1损痰、可以獲取和設(shè)置請(qǐng)求方法
2福侈、確定是否重定向
3、獲取響應(yīng)碼和對(duì)應(yīng)的響應(yīng)描述
4卢未、確定是否使用代理服務(wù)器
5肪凛、包括了幾十個(gè)便于記憶的常量堰汉,對(duì)應(yīng)于HTTP的各種響應(yīng)碼

直接強(qiáng)制轉(zhuǎn)換openConnection()的返回值為HTTPURLConnection即可得到對(duì)應(yīng)的對(duì)象。

請(qǐng)求方法:

public void setRequestMethod(String method)
可以通過(guò)該方法設(shè)置請(qǐng)求方法伟墙,在默認(rèn)情況下會(huì)使用GET方法翘鸭。

HEAD:這個(gè)方法與GET非常相似,唯一的區(qū)別是HEAD只返回HTTP首部戳葵,不返回具體的數(shù)據(jù)內(nèi)容就乓。最常用于檢查文件在最后一次緩存之后是否有修改。

OPTIONS:作用是詢問請(qǐng)求的某個(gè)特定URL支持哪些選項(xiàng)(允許向服務(wù)器發(fā)送的請(qǐng)求茍方法)拱烁,如果請(qǐng)求的URL是(*)生蚁,則這個(gè)請(qǐng)求將作用于整個(gè)服務(wù)器而不是服務(wù)器中某個(gè)特定的URL。OPTIONS請(qǐng)求可以在響應(yīng)頭部的Allow字段中查看選項(xiàng)列表戏自,如Allow:GET邦投,HEAD,POST擅笔,OPTIONS志衣,TRACE。

TRACE:這個(gè)方法會(huì)發(fā)送客戶端的HTTP請(qǐng)求首部剂娄,服務(wù)器將從客戶端接收這個(gè)HTTP首部蠢涝,之所以需要這個(gè)信息玄呛,主要原因是查看服務(wù)器和客戶端之間的代理服務(wù)器做了哪些修改阅懦。

獲取響應(yīng)信息的方法:

public int getResponseCode()? ? 獲取響應(yīng)狀態(tài)碼

public String getResponseMessage()? ? 獲取響應(yīng)狀態(tài)消息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市徘铝,隨后出現(xiàn)的幾起案子耳胎,更是在濱河造成了極大的恐慌,老刑警劉巖惕它,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怕午,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淹魄,警方通過(guò)查閱死者的電腦和手機(jī)郁惜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甲锡,“玉大人兆蕉,你說(shuō)我怎么就攤上這事$吐伲” “怎么了虎韵?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缸废。 經(jīng)常有香客問我包蓝,道長(zhǎng)驶社,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任测萎,我火速辦了婚禮亡电,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硅瞧。我一直安慰自己逊抡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布零酪。 她就那樣靜靜地躺著冒嫡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪四苇。 梳的紋絲不亂的頭發(fā)上孝凌,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音月腋,去河邊找鬼蟀架。 笑死,一個(gè)胖子當(dāng)著我的面吹牛榆骚,可吹牛的內(nèi)容都是我干的片拍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼妓肢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捌省!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碉钠,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纲缓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后喊废,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祝高,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年污筷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了工闺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓣蛀,死狀恐怖陆蟆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揪惦,我是刑警寧澤遍搞,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站器腋,受9級(jí)特大地震影響溪猿,放射性物質(zhì)發(fā)生泄漏钩杰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一诊县、第九天 我趴在偏房一處隱蔽的房頂上張望讲弄。 院中可真熱鬧,春花似錦依痊、人聲如沸避除。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓶摆。三九已至,卻和暖如春性宏,著一層夾襖步出監(jiān)牢的瞬間群井,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工毫胜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留书斜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓酵使,卻偏偏與公主長(zhǎng)得像荐吉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子口渔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345