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)消息