最全的http头部信息分析(转载)
1.http 頭信息詳解
HTTP(HyperTextTransferProtocol)是超文本傳輸協議的縮寫,它用于傳送WWW方式的數據,關于HTTP協議的詳細內容請參考RFC2616。HTTP協議采用了請求/響應模型??蛻舳讼蚍掌靼l送一個請求,請求頭包含請求的方法、URI、協議版本、以及包含請求修飾符、客戶信息和內容的類似于MIME的消息結構。服務器以一個狀態行作為響應,相應的內容包括消息協議的版本,成功或者錯誤編碼加上包含服務器信息、實體元信息以及可能的實體內容。?通常HTTP消息包括客戶機向服務器的請求消息和服務器向客戶機的響應消息。這兩種類型的消息由一個起始行,一個或者多個頭域,一個只是頭域結束的空行和可選的消息體組成。HTTP的頭域包括通用頭,請求頭,響應頭和實體頭四個部分。每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或制表符。?
通用頭域?
通用頭域包含請求和響應消息都支持的頭域,通用頭域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴展要求通訊雙方都支持此擴展,如果存在不支持的通用頭域,一般將會作為實體頭域處理。下面簡單介紹幾個在UPnP消息中使用的通用頭域。?
Cache-Control頭域?
Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置 Cache-Control并不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各個消息中的指令含義如下:?
Public指示響應可被任何緩存區緩存。?
Private指示對于單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當用戶的部分響應消息,此響應消息對于其他用戶的請求無效。?
no-cache指示請求或響應消息不能緩存?
no-store用于防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。?
max-age指示客戶機可以接收生存期不大于指定時間(以秒為單位)的響應。?
min-fresh指示客戶機可以接收響應時間小于當前時間加上指定時間的響應。?
max-stale指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內的響應消息。?
Date頭域?
Date頭域表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,需要知道用戶所在的時區。?
Pragma頭域?
Pragma頭域用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache- Control:no-cache相同。?
請求消息?
請求消息的第一行為下面的格式:?
MethodSPRequest-URISPHTTP-VersionCRLFMethod 表示對于Request-URI完成的方法,這個字段是大小寫敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、 TRACE。方法GET和HEAD應該被所有的通用WEB服務器支持,其他所有方法的實現是可選的。GET方法取回由Request-URI標識的信息。 HEAD方法也是取回由Request-URI標識的信息,只是可以在響應時,不返回消息體。POST方法可以請求服務器接收包含在請求中的實體信息,可以用于提交表單,向新聞組、BBS、郵件群組和數據庫發送消息。?
SP表示空格。Request-URI遵循URI格式,在此字段為星號(*)時,說明請求并不用于某個特定的資源地址,而是用于服務器本身。HTTP- Version表示支持的HTTP版本,例如為HTTP/1.1。CRLF表示換行回車符。請求頭域允許客戶端向服務器傳遞關于請求或者關于客戶機的附加信息。請求頭域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。對請求頭域的擴展要求通訊雙方都支持,如果存在不支持的請求頭域,一般將會作為實體頭域處理。?
典型的請求消息:?
GET http://download.microtool.de:80/somedata.exe?
Host: download.microtool.de?
Accept:*/*?
Pragma: no-cache?
Cache-Control: no-cache?
Referer: http://download.microtool.de/?
User-Agent:Mozilla/4.04[en](Win95;I;Nav)?
Range:bytes=554554-?
上例第一行表示HTTP客戶端(可能是瀏覽器、下載程序)通過GET方法獲得指定URL下的文件。棕色的部分表示請求頭域的信息,綠色的部分表示通用頭部分。?
Host頭域?
Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務器或網關的位置。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀態碼返回。?
Referer頭域?
Referer頭域允許客戶端指定請求uri的源資源地址,這可以允許服務器生成回退鏈表,可用來登陸、優化cache等。他也允許廢除的或錯誤的連接由于維護的目的被追蹤。如果請求的uri沒有自己的uri地址,Referer不能被發送。如果指定的是部分uri地址,則此地址應該是一個相對地址。?
Range頭域?
Range頭域可以請求實體的一個或者多個子范圍。例如,?
表示頭500個字節:bytes=0-499?
表示第二個500字節:bytes=500-999?
表示最后500個字節:bytes=-500?
表示500字節以后的范圍:bytes=500-?
第一個和最后一個字節:bytes=0-0,-1?
同時指定幾個范圍:bytes=500-600,601-999?
但是服務器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200 (OK)。?
User-Agent頭域?
User-Agent頭域的內容包含發出請求的用戶信息。?
響應消息?
響應消息的第一行為下面的格式:?
HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF?
HTTP-Version表示支持的HTTP版本,例如為HTTP/1.1。Status- Code是一個三個數字的結果代碼。Reason-Phrase給Status-Code提供一個簡單的文本描述。Status-Code主要用于機器自動識別,Reason-Phrase主要用于幫助用戶理解。Status-Code的第一個數字定義響應的類別,后兩個數字沒有分類的作用。第一個數字可能取5個不同的值:?
1xx:信息響應類,表示接收到請求并且繼續處理?
2xx:處理成功響應類,表示動作被成功接收、理解和接受?
3xx:重定向響應類,為了完成指定的動作,必須接受進一步處理?
4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行?
5xx:服務端錯誤,服務器不能正確執行一個正確的請求?
響應頭域允許服務器傳遞不能放在狀態行的附加信息,這些域主要描述服務器的信息和 Request-URI進一步的信息。響應頭域包含Age、Location、Proxy-Authenticate、Public、Retry- After、Server、Vary、Warning、WWW-Authenticate。對響應頭域的擴展要求通訊雙方都支持,如果存在不支持的響應頭域,一般將會作為實體頭域處理。?
典型的響應消息:?
HTTP/1.0200OK?
Date:Mon,31Dec200104:25:57GMT?
Server:Apache/1.3.14(Unix)?
Content-type:text/html?
Last-modified:Tue,17Apr200106:46:28GMT?
Etag:"a030f020ac7c01:1e9f"?
Content-length:39725426?
Content-range:bytes554554-40279979/40279980?
上例第一行表示HTTP服務端響應一個GET方法。棕色的部分表示響應頭域的信息,綠色的部分表示通用頭部分,紅色的部分表示實體頭域的信息。?
Location響應頭?
Location響應頭用于重定向接收者到一個新URI地址。?
Server響應頭?
Server響應頭包含處理請求的原始服務器的軟件信息。此域能包含多個產品標識和注釋,產品標識一般按照重要性排序。?
實體?
請求消息和響應消息都可以包含實體信息,實體信息一般由實體頭域和實體組成。實體頭域包含關于實體的原信息,實體頭包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允許客戶端定義新的實體頭,但是這些域可能無法未接受方識別。實體可以是一個經過編碼的字節流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。?
Content-Type實體頭?
Content-Type實體頭用于向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型,或GET方法發送的請求介質類型 Content-Range實體頭?
Content-Range實體頭用于指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的范圍和整個實體長度。一般格式:?
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth?
例如,傳送頭500個字節次字段的形式:Content-Range:bytes0- 499/1234如果一個http消息包含此節(例如,對范圍請求的響應或對一系列范圍的重疊請求),Content-Range表示傳送的范圍, Content-Length表示實際傳送的字節數。?
Last-modified實體頭?
Last-modified實體頭指定服務器上保存內容的最后修訂時間。?
| 應答頭 | 說明 |
| Allow | 服務器支持哪些請求方法(如GET、POST等)。 |
| Content-Encoding | 文檔的編碼(Encode)方法。只有在解碼之后才可以得到Content-Type頭指定的內容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。Java的GZIPOutputStream可以很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet應該通過查看Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支持gzip,為支持gzip的瀏覽器返回經gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。 |
| Content-Length | 表示內容長度。只有當瀏覽器使用持久HTTP連接時才需要這個數據。如果你想要利用持久連接的優勢,可以把輸出文檔寫入ByteArrayOutputStram,完成后查看其大小,然后把該值放入Content-Length頭,最后通過byteArrayStream.writeTo(response.getOutputStream()發送內容。 |
| Content-Type | 表示后面的文檔屬于什么MIME類型。Servlet默認為text/plain,但通常需要顯式地指定為text/html。由于經常要設置Content-Type,因此HttpServletResponse提供了一個專用的方法setContentTyep。 |
| Date | 當前的GMT時間。你可以用setDateHeader來設置這個頭以避免轉換時間格式的麻煩。 |
| Expires | 應該在什么時候認為文檔已經過期,從而不再緩存它? |
| Last-Modified | 文檔的最后改動時間??蛻艨梢酝ㄟ^If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲于指定時間的文檔才會返回,否則返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設置。 |
| Location | 表示客戶應當到哪里去提取文檔。Location通常不是直接設置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設置狀態代碼為302。 |
| Refresh | 表示瀏覽器應該在多少時間之后刷新文檔,以秒計。除了刷新當前文檔之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。? 注意這種功能通常是通過設置HTML頁面HEAD區的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現,這是因為,自動刷新或重定向對于那些不能使用CGI或Servlet的HTML編寫者十分重要。但是,對于Servlet來說,直接設置Refresh頭更加方便。? 注意Refresh的意義是“N秒之后刷新本頁面或訪問指定頁面”,而不是“每隔N秒刷新本頁面或訪問指定頁面”。因此,連續刷新要求每次都發送一個Refresh頭,而發送204狀態代碼則可以阻止瀏覽器繼續刷新,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>。? 注意Refresh頭不屬于HTTP 1.1正式規范的一部分,而是一個擴展,但Netscape和IE都支持它。 |
| Server | 服務器名字。Servlet一般不設置這個值,而是由Web服務器自己設置。 |
| Set-Cookie | 設置和頁面關聯的Cookie。Servlet不應使用response.setHeader("Set-Cookie", ...),而是應使用HttpServletResponse提供的專用方法addCookie。參見下文有關Cookie設置的討論。 |
| WWW-Authenticate | 客戶應該在Authorization頭中提供什么類型的授權信息?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。? 注意Servlet一般不進行這方面的處理,而是讓Web服務器的專門機制來控制受密碼保護頁面的訪問(例如.htaccess)。 |
?
?
2.HTTP請求頭概述?
HTTP客戶程序(例如瀏覽器),向服務器發送請求的時候必須指明請求類型(一般是GET或者POST)。如有必要,客戶程序還可以選擇發送其他的請求頭。大多數請求頭并不是必需的,但Content-Length除外。對于POST請求來說Content-Length必須出現。?
下面是一些最常見的請求頭:?
Accept:瀏覽器可接受的MIME類型。?
Accept-Charset:瀏覽器可接受的字符集。?
Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間。?
Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。?
Authorization:授權信息,通常出現在對服務器發送的WWW-Authenticate頭的應答中。?
Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet需要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然后在正式寫出內容之前計算它的大小。?
Content-Length:表示請求消息正文的長度。?
Cookie:這是最重要的請求頭信息之一,參見后面《Cookie處理》一章中的討論。?
From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。?
Host:初始URL中的主機和端口。?
If-Modified-Since:只有當所請求的內容在指定的日期之后又經過修改才返回它,否則返回304“Not Modified”應答。?
Pragma:指定“no-cache”值表示服務器必須返回一個刷新后的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝。?
Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。?
User-Agent:瀏覽器類型,如果Servlet返回的內容與瀏覽器類型有關則該值非常有用。?
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操作系統和CPU類型。?
有關HTTP頭完整、詳細的說明,請參見http://www.w3.org/Protocols/的HTTP規范。?
在Servlet 中讀取請求頭?
在Servlet中讀取HTTP頭是非常方便的,只需要調用一下HttpServletRequest的getHeader方法即可。如果客戶請求中提供了指定的頭信息,getHeader返回對應的字符串;否則,返回null。部分頭信息經常要用到,它們有專用的訪問方法:getCookies方法返回Cookie頭的內容,經解析后存放在Cookie對象的數組中,請參見后面有關Cookie章節的討論;getAuthType和getRemoteUser方法分別讀取Authorization頭中的一部分內容;getDateHeader和getIntHeader方法讀取指定的頭,然后返回日期值或整數值。?
除了讀取指定的頭之外,利用getHeaderNames還可以得到請求中所有頭名字的一個Enumeration對象。?
最后,除了查看請求頭信息之外,我們還可以從請求主命令行獲得一些信息。getMethod方法返回請求方法,請求方法通常是GET或者POST,但也有可能是HEAD、PUT或者DELETE。getRequestURI方法返回URI(URI是URL的從主機和端口之后到表單數據之前的那一部分)。getRequestProtocol返回請求命令的第三部分,一般是“HTTP/1.0”或者“HTTP/1.1”。?
實例:輸出所有的請求頭?
下面的Servlet實例把所有接收到的請求頭和它的值以表格的形式輸出。另外,該Servlet還會輸出主請求命令的三個部分:請求方法,URI,協議/版本。?
ShowRequestHeaders.java?
| package hall; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class ShowRequestHeaders extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "顯示所有請求頭"; out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<B>Request Method: </B>" + request.getMethod() + "<BR>\n" + "<B>Request URI: </B>" + request.getRequestURI() + "<BR>\n" + "<B>Request Protocol: </B>" + request.getProtocol() + "<BR><BR>\n" + "<TABLE BORDER=1 ALIGN=CENTER>\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Header Name<TH>Header Value"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); out.println("<TR><TD>" + headerName); out.println(" <TD>" + request.getHeader(headerName)); } out.println("</TABLE>\n</BODY></HTML>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }? |
3.
| ||||
HTTP規范定義了8種可能的請求方法: HTTP參考 |
最近做的項目總是和http協議打交道,又學到不少。模擬http報頭,獲取server的http頭等等??赡芤郧叭ψ诱娴暮苄?#xff0c;這方面總是很模糊,現在看來把瀏覽器的原理搞清楚是很重要的。
下面是獲取頭信息,做個備忘。
PHP代碼:$fp?=?fsockopen("www.example.com",?80,?$errno,?$errstr,?30);
if?(!$fp)?{
?????echo?"$errstr?($errno)<br?/>/n";
}?else?{
$out?????=?"GET?/?HTTP/1.1";
$out?.=?"Host:?www.example.com";
$out?.=?"Accept:?*/*";
fwrite($fp,?$out);
while?(!feof($fp))?{
?????$content.=fgets($fp,?128);
}
fclose($fp);
echo?$content;
}?
引用:
在Web開發的過程中,人們常常忽視了這樣的一個事實:很多工作都是在底層完成的——是底層協議使得客戶端瀏覽器與Web服務器之間的通信成為可能。學習通信的過程是值得的,因為你可以從中得到數量令人吃驚的有用信息。例如,你可以建立自適應的Web應用程序,它可以根據用戶瀏覽器的性能得到最好的效果,而且你可以改變報頭信息來把自定義頁面傳遞到各種平臺上,包括無線電話和PDA。
HTTP 請求頭概述?
HTTP 客戶程序(例如瀏覽器),向服務器發送請求的時候必須指明請求類型(一般是GET或者POST)。如有必要,客戶程序還可以選擇發送其他的請求頭。大多數請求頭并不是必需的,但Content-Length除外。對于POST請求來說Content-Length必須出現。?
下面是一些最常見的請求頭:?
Accept:瀏覽器可接受的MIME類型。?
Accept-Charset:瀏覽器可接受的字符集。?
Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間。?
Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。?
Authorization:授權信息,通常出現在對服務器發送的WWW-Authenticate頭的應答中。?
Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點, Servlet需要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然后在正式寫出內容之前計算它的大小。?
Content-Length:表示請求消息正文的長度。?
Cookie:這是最重要的請求頭信息之一,參見后面《Cookie處理》一章中的討論。?
From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。?
Host:初始URL中的主機和端口。?
If-Modified-Since:只有當所請求的內容在指定的日期之后又經過修改才返回它,否則返回304“Not Modified”應答。?
Pragma:指定“no-cache”值表示服務器必須返回一個刷新后的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝。?
Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。?
User-Agent:瀏覽器類型,如果Servlet返回的內容與瀏覽器類型有關則該值非常有用。?
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操作系統和CPU類型。?
有關HTTP頭完整、詳細的說明,請參見http://www.w3.org/Protocols/的HTTP規范。
5.XMLHttpRequest
提供客戶端同http服務器通訊的協議
Dim HttpReq As New MSXML2.XMLHTTP30 HttpReq.open "GET", "http://localhost/books.xml", False HttpReq.send MsgBox HttpReq.responseText備注
客戶端可以通過XmlHttp對象(MSXML2.XMLHTTP.3.0)向http服務器發送請求并使用微軟XML文檔對象模型Microsoft? XML Document Object Model (DOM)處理回應。
XMLHttpRequest成員
屬性
?
| onreadystatechange | 指定當readyState屬性改變時的事件處理句柄。只寫 |
| readyState | 返回當前請求的狀態,只讀. |
| responseBody | 將回應信息正文以unsigned byte數組形式返回.只讀 |
| responseStream | 以Ado Stream對象的形式返回響應信息。只讀 |
| responseText | 將響應信息作為字符串返回.只讀 |
| responseXML | 將響應信息格式化為Xml Document對象并返回,只讀 |
| status | 返回當前請求的http狀態碼.只讀 |
| statusText | 返回當前請求的響應行狀態,只讀 |
?
* 表示此屬性是W3C文檔對象模型的擴展.
方法
?
| abort | 取消當前請求 |
| getAllResponseHeaders | 獲取響應的所有http頭 |
| getResponseHeader | 從響應信息中獲取指定的http頭 |
| open | 創建一個新的http請求,并指定此請求的方法、URL以及驗證信息(用戶名/密碼) |
| send | 發送請求到http服務器并接收回應 |
| setRequestHeader | 單獨指定請求的某個http頭 |
?
onreadystatechange
指定當readyState屬性改變時的事件處理句柄
語法
oXMLHttpRequest.onreadystatechange = funcMyHandler;如下的例子演示當XMLHTTPRequest對象的readyState屬性改變時調用HandleStateChange函數,當數據接收完畢后(readystate == 4)此頁面上的一個按鈕將被激活
var xmlhttp=null; function PostOrder(xmldoc) { var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.5.0"); xmlhttp.Open("POST", "http://myserver/orders/processorder.asp", false); xmlhttp.onreadystatechange= HandleStateChange; xmlhttp.Send(xmldoc); myButton.disabled = true; } function HandleStateChange() { if (xmlhttp.readyState == 4) { myButton.disabled = false; alert("Result = " + xmlhttp.responseXML.xml); } }備注
此屬性只寫,為W3C文檔對象模型的擴展.
readyState
返回XMLHTTP請求的當前狀態
語法
lValue = oXMLHttpRequest.readyState; var XmlHttp; XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); function send() { XmlHttp.onreadystatechange = doHttpReadyStateChange; XmlHttp.open("GET", "http://localhost/sample.xml", true); XmlHttp.send(); } function doHttpReadyStateChange() { if (XmlHttp.readyState == 4) { alert("Done"); } }備注
變量,此屬性只讀,狀態用長度為4的整型表示.定義如下:
?
| 0 (未初始化) | 對象已建立,但是尚未初始化(尚未調用open方法) |
| 1 (初始化) | 對象已建立,尚未調用send方法 |
| 2 (發送數據) | send方法已調用,但是當前的狀態及http頭未知 |
| 3 (數據傳送中) | 已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤, |
| 4 (完成) | 數據接收完畢,此時可以通過通過responseBody和responseText獲取完整的回應數據 |
?
responseBody
返回某一格式的服務器響應數據
語法
strValue = oXMLHttpRequest.responseBody; var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); xmlhttp.open("GET", "http://localhost/books.xml", false); xmlhttp.send(); alert(xmlhttp.responseBody);備注
變量,此屬性只讀,以unsigned array格式表示直接從服務器返回的未經解碼的二進制數據。
responseStream
以Ado Stream對象的形式返回響應信息
語法
strValue = oXMLHttpRequest.responseStream;備注
變量,此屬性只讀,以Ado Stream對象的形式返回響應信息。
responseText
將響應信息作為字符串返回
語法
strValue = oXMLHttpRequest.responseText; var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); xmlhttp.open("GET", "http://localhost/books.xml", false); xmlhttp.send(); alert(xmlhttp.responseText);備注
變量,此屬性只讀,將響應信息作為字符串返回。
XMLHTTP嘗試將響應信息解碼為Unicode字符串,XMLHTTP默認將響應數據的編碼定為UTF-8,如果服務器返回的數據帶BOM(byte-order mark),XMLHTTP可以解碼任何UCS-2 (big or little endian)或者UCS-4 數據。注意,如果服務器返回的是xml文檔,此屬性并不處理xml文檔中的編碼聲明。你需要使用responseXML來處理。
responseXML
將響應信息格式化為Xml Document對象并返回
語法
var objDispatch = oXMLHttpRequest.responseXML; var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); xmlhttp.open("GET", "http://localhost/books.xml", false); xmlhttp.send(); alert(xmlhttp.responseXML.xml);備注
變量,此屬性只讀,將響應信息格式化為Xml Document對象并返回。如果響應數據不是有效的XML文檔,此屬性本身不返回XMLDOMParseError,可以通過處理過的DOMDocument對象獲取錯誤信息。
status
返回當前請求的http狀態碼
語法
lValue = oXMLHttpRequest.status; var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); xmlhttp.open("GET", "http://localhost/books.xml", false); xmlhttp.send(); alert(xmlhttp.status);返回值
長整形標準http狀態碼,定義如下:
100 | Continue |
101 | Switching protocols |
200 | OK |
201 | Created |
202 | Accepted |
203 | Non-Authoritative Information |
204 | No Content |
205 | Reset Content |
206 | Partial Content |
300 | Multiple Choices |
301 | Moved Permanently |
302 | Found |
303 | See Other |
304 | Not Modified |
305 | Use Proxy |
307 | Temporary Redirect |
400 | Bad Request |
401 | Unauthorized |
402 | Payment Required |
403 | Forbidden |
404 | Not Found |
405 | Method Not Allowed |
406 | Not Acceptable |
407 | Proxy Authentication Required |
408 | Request Timeout |
409 | Conflict |
410 | Gone |
411 | Length Required |
412 | Precondition Failed |
413 | Request Entity Too Large |
414 | Request-URI Too Long |
415 | Unsupported Media Type |
416 | Requested Range Not Suitable |
417 | Expectation Failed |
500 | Internal Server Error |
501 | Not Implemented |
502 | Bad Gateway |
503 | Service Unavailable |
504 | Gateway Timeout |
505 | HTTP Version Not Supported |
?
備注
長整形,此屬性只讀,返回當前請求的http狀態碼,此屬性僅當數據發送并接收完畢后才可獲取。
statusText
返回當前請求的響應行狀態
語法
strValue = oXMLHttpRequest.statusText; var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); xmlhttp.open("GET", "http://localhost/books.xml", false); xmlhttp.send(); alert(xmlhttp.statusText);備注
字符串,此屬性只讀,以BSTR返回當前請求的響應行狀態,此屬性僅當數據發送并接收完畢后才可獲取。
abort
取消當前請求
語法
oXMLHttpRequest.abort();備注
調用此方法后,當前請求返回UNINITIALIZED 狀態。
getAllResponseHeaders
獲取響應的所有http頭
語法
strValue = oXMLHttpRequest.getAllResponseHeaders(); var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); xmlhttp.open("GET", "http://localhost/sample.xml", false); xmlhttp.send(); alert(xmlhttp.getAllResponseHeaders());輸出由web服務器返回的http頭信息:
Server:Microsoft-IIS/5.1 X-Powered-By:ASP.NET Date:Sat, 07 Jun 2003 23:23:06 GMT Content-Type:text/xml Accept-Ranges:bytes Last Modified:Sat, 06 Jun 2003 17:19:04 GMT ETag:"a0e2eeba4f2cc31:97f" Content-Length:9備注
每個http頭名稱和值用冒號分割,并以/r/n結束。當send方法完成后才可調用該方法。
getResponseHeader
從響應信息中獲取指定的http頭
語法
strValue = oXMLHttpRequest.getResponseHeader(bstrHeader); var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.3.0"); xmlhttp.open("GET", "http://localhost/sample.xml", false); xmlhttp.send(); alert(xmlhttp.getResponseHeader("Server"));輸出http頭中的server列:當前web服務器的版本及名稱。
備注
當send方法成功后才可調用該方法。如果服務器返回的文檔類型為"text/xml", 則這句話xmlhttp.getResponseHeader("Content-Type");將返回字符串"text/xml"??梢允褂胓etAllResponseHeaders方法獲取完整的http頭信息。
open
創建一個新的http請求,并指定此請求的方法、URL以及驗證信息
語法
oXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);參數
bstrMethod
http方法,例如:POST、GET、PUT及PROPFIND。大小寫不敏感。
bstrUrl
請求的URL地址,可以為絕對地址也可以為相對地址。
varAsync[可選]
布爾型,指定此請求是否為異步方式,默認為true。如果為真,當狀態改變時會調用onreadystatechange屬性指定的回調函數。
bstrUser[可選]
如果服務器需要驗證,此處指定用戶名,如果未指定,當服務器需要驗證時,會彈出驗證窗口。
bstrPassword[可選]
驗證信息中的密碼部分,如果用戶名為空,則此值將被忽略。
下面的例子演示從服務器請求book.xml,并顯示其中的book字段。
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); xmlhttp.open("GET","http://localhost/books.xml", false); xmlhttp.send(); var book = xmlhttp.responseXML.selectSingleNode("//book[@id='bk101']"); alert(book.xml);備注
調用此方法后,可以調用send方法向服務器發送數據。
send
發送請求到http服務器并接收回應
語法
oXMLHttpRequest.send(varBody);參數
varBody?
欲通過此請求發送的數據。
備注
此方法的同步或異步方式取決于open方法中的bAsync參數,如果bAsync == False,此方法將會等待請求完成或者超時時才會返回,如果bAsync == True,此方法將立即返回。
This method takes one optional parameter, which is the requestBody to use. The acceptable VARIANT input types are BSTR, SAFEARRAY of UI1 (unsigned bytes), IDispatch to an XML Document Object Model (DOM) object, and IStream *. You can use only chunked encoding (for sending) when sending IStream * input types. The component automatically sets the Content-Length header for all but IStream * input types.
如果發送的數據為BSTR,則回應被編碼為utf-8, 必須在適當位置設置一個包含charset的文檔類型頭。
If the input type is a SAFEARRAY of UI1, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.
如果發送的數據為XML DOM object,則回應將被編碼為在xml文檔中聲明的編碼,如果在xml文檔中沒有聲明編碼,則使用默認的UTF-8。
If the input type is an IStream *, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.
setRequestHeader
單獨指定請求的某個http頭
語法
oXMLHttpRequest.setRequestHeader(bstrHeader, bstrValue);參數
bstrHeader
字符串,頭名稱。
bstrValue
字符串,值。
參考鏈接:https://blog.csdn.net/adparking/article/details/52289543
總結
以上是生活随笔為你收集整理的最全的http头部信息分析(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习nginx接口调用之摘录
- 下一篇: Linux下的sleep()和sched