XMLHTTPRequestµÄÊôÐԺͷ½·¨
Éè¼ÆAJAXʱʹÓõÄÒ»¸öÖØÒªµÄ¼¼Êõ£¨¹¤¾ß£©¾ÍÊÇXMLHTTPRequest¶ÔÏóÁË¡£XMLHttpRequest¶ÔÏóÊǵ±½ñËùÓÐAJAXºÍWeb 2.0Ó¦ÓóÌÐòµÄ¼¼Êõ»ù´¡¡£¾¡¹ÜÈí¼þ¾ÏúÉ̺ͿªÔ´ÉçÍÅÏÖÔÚ¶¼ÔÚÌṩ¸÷ÖÖAJAX¿ò¼ÜÒÔ½øÒ»²½¼ò»¯XMLHttpRequest¶ÔÏóµÄʹÓ㻵«ÊÇ£¬ÎÒÃÇÈÔÈ»ºÜÓбØÒªÀí½âÕâ¸ö¶ÔÏóµÄµÄÊôÐԺͷ½·¨¼ò½é¡£ ÍøÒ³½ÌÑ§Íø
1¡¢XMLHTTPRequest¶ÔÏóʲôÊÇ£¿
×îͨÓõ͍ÒåΪ£ºXmlHttpÊÇÒ»Ì׿ÉÒÔÔÚJavascript¡¢VbScript¡¢JscriptµÈ½Å±¾ÓïÑÔÖÐͨ¹ýhttpÐÒé´«ËÍ»ò´Ó½ÓÊÕXML¼°ÆäËûÊý¾ÝµÄÒ»Ì×API¡£XmlHttp×î´óµÄÓô¦ÊÇ¿ÉÒÔ¸üÐÂÍøÒ³µÄ²¿·ÖÄÚÈݶø²»ÐèҪˢÐÂÕû¸öÒ³Ãæ¡££¨Õâ¸ö¹¦ÄÜÕýÊÇAJAXµÄÒ»´óÌØµãÖ®Ò»£©
À´×ÔMSDNµÄ½âÊÍ£ºXmlHttpÌṩ¿Í»§¶Ëͬhttp·þÎñÆ÷ͨѶµÄÐÒé¡£¿Í»§¶Ë¿ÉÒÔͨ¹ýXmlHttp¶ÔÏó(MSXML2.XMLHTTP.3.0)Ïòhttp·þÎñÆ÷·¢ËÍÇëÇó²¢Ê¹ÓÃ΢ÈíXMLÎĵµ¶ÔÏóÄ£ÐÍMicrosoft? XML Document Object Model (DOM)´¦Àí»ØÓ¦¡£
ÕâÀï˵ЩÌâÍâ»°£¬ÆäʵÕâ¸ö¶«Î÷ºÜÔç¾Í³öÏÖÁË£¬Ö»ÊÇÒÔǰä¯ÀÀÆ÷µÄÖ§³Ö²»¹»£¬Ö»ÓÐIEÖвÅÖ§³Ö£¬ËùÒÔ´ó¶àÊýµÄWEB³ÌÐòÔ±¶¼Ã»ÓÐÔõôÓÃËû£¬µ«ÊÇÏÖÔÚÇé¿ö·¢ÉúÁËºÜ´óµØ¸Ä±ä£¬MozillaºÍSafari°ÑËü²ÉÓÃΪÊÂʵÉϵıê×¼£¬Ö÷Á÷µÄä¯ÀÀÆ÷¶¼¿ªÊ¼Ö§³ÖXMLHTTPRequest¶ÔÏóÁË¡£µ«ÊÇÕâÀïÐèÒªÖØµã˵Ã÷µÄÊÇXMLHTTPRequestĿǰ»¹²»ÊÇÒ»¸öW3CµÄ±ê×¼£¬ËùÒÔÔÚ²»Í¬µÄä¯ÀÀÆ÷ÉϱíÏÖÒ²ÉÔÓÐÐ©Çø±ð¡£
2¡¢´´½¨XMLHTTPRequest¶ÔÏó
˵µ½Çø±ð£¬ÎÒÃÇÕâÀïÀ´¿´¿´ÔõôÀ´ÉùÃ÷£¨Ê¹Óã©Ëü£¬ÔÚʹÓÃXMLHTTPRequest¶ÔÏó·¢ËÍÇëÇóºÍ´¦ÀíÏìӦ֮ǰ£¬ÎÒÃDZØÐëÒªÓÃjavascript´´½¨Ò»¸öXMLHTTPRequest¶ÔÏó¡££¨IE°ÑXMLHTTPRequestʵÏÖΪһ¸öActiveX¶ÔÏ󣬯äËûµÄä¯ÀÀÆ÷[ÈçFirefox/Safari/Opear]Ôò°ÑËüʵÏÖΪһ¸ö±¾µØµÄjavascript¶ÔÏ󣩡£ÏÂÃæÎÒÃǾÍÀ´¿´¿´¾ßÌåÔõôÔËÓÃjavascriptÀ´´´½¨Ëü°É£º
| <script language="javascript" type="text/javascript"> <!-- var xmlhttp; // ´´½¨XMLHTTPRequest¶ÔÏó function createXMLHTTPRequest(){ if(window.ActiveXObject){ // ÅжÏÊÇ·ñÖ§³ÖActiveX¿Ø¼þ xmlhttp = new ActiveObject("Microsoft.XMLHTTP"); // ͨ¹ýʵÀý»¯ActiveXObjectµÄÒ»¸öÐÂʵÀýÀ´´´½¨XMLHTTPRequest¶ÔÏó } else if(window.XMLHTTPRequest){ // ÅжÏÊÇ·ñ°ÑXMLHTTPRequestʵÏÖΪһ¸ö±¾µØjavascript¶ÔÏó xmlhttp = new XMLHTTPRequest(); // ´´½¨XMLHTTPRequestµÄÒ»¸öʵÀý£¨±¾µØjavascript¶ÔÏó£© } } //--> </script>3¡¢ÊôÐԺͷ½·¨ ÓÉÓÚ¶«Î÷Ì«¶àÏÖÔÚÏÈÓøöÒ³ÃæÀ´Áоٳö˵Óеķ½·¨ºÍÊôÐÔ£¬ÒÔºóÔÙÀ´Ïêϸ¾ÙÀý£¨Ö÷ÒªÊDZ¾ÈËÒ²ÔÚѧϰÖУ©¡£ <html> <head> <title>XMLHTTPRequest¶ÔÏóµÄ˵Ã÷DEMO</title> <script language="javascript" type="text/javascript"> <!-- var xmlhttp; // ´´½¨Ò»¸öXMLHTTPRequest¶ÔÏó function createXMLHTTPRequext(){ if(window.ActiveXObject) { xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); } else if(window.XMLHTTPRequest){ xmlhttp = new XMLHTTPRequest(); Webjx.Com } } function PostOrder(xmldoc) { createXMLHTTPRequext(); // ·½·¨£ºopen // ´´½¨Ò»¸öеÄhttpÇëÇ󣬲¢Ö¸¶¨´ËÇëÇóµÄ·½·¨¡¢URLÒÔ¼°ÑéÖ¤ÐÅÏ¢ // Óï·¨£ºoXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword); // ²ÎÊý // bstrMethod // http·½·¨£¬ÀýÈ磺POST¡¢GET¡¢PUT¼°PROPFIND¡£´óСд²»Ãô¸Ð¡£ // bstrUrl // ÇëÇóµÄURLµØÖ·£¬¿ÉÒÔΪ¾ø¶ÔµØÖ·Ò²¿ÉÒÔΪÏà¶ÔµØÖ·¡£ // varAsync[¿ÉÑ¡] // ²¼¶ûÐÍ£¬Ö¸¶¨´ËÇëÇóÊÇ·ñΪÒì²½·½Ê½£¬Ä¬ÈÏΪtrue¡£Èç¹ûÎªÕæ£¬µ±×´Ì¬¸Ä±äʱ»áµ÷ÓÃonreadystatechangeÊôÐÔÖ¸¶¨µÄ»Øµ÷º¯Êý¡£ // bstrUser[¿ÉÑ¡] // Èç¹û·þÎñÆ÷ÐèÒªÑéÖ¤£¬´Ë´¦Ö¸¶¨Óû§Ãû£¬Èç¹ûδָ¶¨£¬µ±·þÎñÆ÷ÐèÒªÑé֤ʱ£¬»áµ¯³öÑéÖ¤´°¿Ú¡£ // bstrPassword[¿ÉÑ¡] // ÑéÖ¤ÐÅÏ¢ÖеÄÃÜÂ벿·Ö£¬Èç¹ûÓû§ÃûΪ¿Õ£¬Ôò´ËÖµ½«±»ºöÂÔ¡£ // ±¸×¢£ºµ÷Óô˷½·¨ºó£¬¿ÉÒÔµ÷ÓÃsend·½·¨Ïò·þÎñÆ÷·¢ËÍÊý¾Ý¡£ xmlhttp.Open("get", "http://localhost/example.htm", false); // var book = xmlhttp.responseXML.selectSingleNode("//book[@id='bk101']"); // alert(book.xml); // ÊôÐÔ£ºonreadystatechange // onreadystatechange£ºÖ¸¶¨µ±readyStateÊôÐԸıäʱµÄʼþ´¦Àí¾ä±ú // Óï·¨£ºoXMLHttpRequest.onreadystatechange = funcMyHandler; // ÈçϵÄÀý×ÓÑÝʾµ±XMLHTTPRequest¶ÔÏóµÄreadyStateÊôÐԸıäʱµ÷ÓÃHandleStateChangeº¯Êý£¬ // µ±Êý¾Ý½ÓÊÕÍê±Ïºó£¨readystate == 4£©´ËÒ³ÃæÉϵÄÒ»¸ö°´Å¥½«±»¼¤»î // ±¸×¢£º´ËÊôÐÔֻд£¬ÎªW3CÎĵµ¶ÔÏóÄ£Ð͵ÄÀ©Õ¹. xmlhttp.onreadystatechange= HandleStateChange; // ·½·¨£º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. xmlhttp.Send(xmldoc); // ·½·¨£ºgetAllResponseHeaders // »ñÈ¡ÏìÓ¦µÄËùÓÐhttpÍ· // Óï·¨£ºstrValue = oXMLHttpRequest.getAllResponseHeaders(); // ±¸×¢£ºÃ¿¸öhttpÍ·Ãû³ÆºÍÖµÓÃðºÅ·Ö¸î£¬²¢ÒÔ\r\n½áÊø¡£µ±send·½·¨Íê³Éºó²Å¿Éµ÷Óø÷½·¨¡£ alert(xmlhttp.getAllResponseHeaders()); // ·½·¨£ºgetResponseHeader // ´ÓÏìÓ¦ÐÅÏ¢Öлñȡָ¶¨µÄhttpÍ· // Óï·¨£ºstrValue = oXMLHttpRequest.getResponseHeader(bstrHeader); // ±¸×¢£ºµ±send·½·¨³É¹¦ºó²Å¿Éµ÷Óø÷½·¨¡£Èç¹û·þÎñÆ÷·µ»ØµÄÎĵµÀàÐÍΪ"text/xml", ÔòÕâ¾ä»° // xmlhttp.getResponseHeader("Content-Type");½«·µ»Ø×Ö·û´®"text/xml"¡£¿ÉÒÔʹÓÃgetAllResponseHeaders·½·¨»ñÈ¡ÍêÕûµÄhttpÍ·ÐÅÏ¢¡£ alert(xmlhttp.getResponseHeader("Content-Type")); // Êä³öhttpÍ·ÖеÄContent-TypeÁУºµ±Ç°web·þÎñÆ÷µÄ°æ±¾¼°Ãû³Æ¡£ document.frmTest.myButton.disabled = true; // ·½·¨£ºabort // È¡Ïûµ±Ç°ÇëÇó // Óï·¨£ºoXMLHttpRequest.abort(); // ±¸×¢£ºµ÷Óô˷½·¨ºó£¬µ±Ç°ÇëÇó·µ»ØUNINITIALIZED ״̬¡£ // xmlhttp.abort(); // ·½·¨£ºsetRequestHeader // µ¥¶ÀÖ¸¶¨ÇëÇóµÄij¸öhttpÍ· // Óï·¨£ºoXMLHttpRequest.setRequestHeader(bstrHeader, bstrValue); // ²ÎÊý£ºbstrHeader£¨×Ö·û´®£¬Í·Ãû³Æ¡££© // bstrValue£¨×Ö·û´®£¬Öµ¡££© ÍøÒ³½ÌÑ§Íø // ±¸×¢£ºÈç¹ûÒѾ´æÔÚÒÑ´ËÃû³ÆÃüÃûµÄhttpÍ·£¬Ôò¸²¸ÇÖ®¡£´Ë·½·¨±ØÐëÔÚopen·½·¨ºóµ÷Óᣠ// xmlhttp.setRequestHeader(bstrHeader, bstrValue); } function HandleStateChange() { // ÊôÐÔ£ºreadyState // ·µ»ØXMLHTTPÇëÇóµÄµ±Ç°×´Ì¬ // Óï·¨£ºlValue = oXMLHttpRequest.readyState; // ±¸×¢£º±äÁ¿£¬´ËÊôÐÔÖ»¶Á£¬×´Ì¬Óó¤¶ÈΪ4µÄÕûÐͱíʾ.¶¨ÒåÈçÏ£º // 0 (δ³õʼ»¯) ¶ÔÏóÒѽ¨Á¢£¬µ«ÊÇÉÐδ³õʼ»¯£¨ÉÐδµ÷ÓÃopen·½·¨£© // 1 (³õʼ»¯) ¶ÔÏóÒѽ¨Á¢£¬ÉÐδµ÷ÓÃsend·½·¨ // 2 (·¢ËÍÊý¾Ý) send·½·¨Òѵ÷Ó㬵«Êǵ±Ç°µÄ״̬¼°httpͷδ֪ // 3 (Êý¾Ý´«ËÍÖÐ) ÒѽÓÊÕ²¿·ÖÊý¾Ý£¬ÒòΪÏìÓ¦¼°httpÍ·²»È«£¬Õâʱͨ¹ýresponseBodyºÍresponseText»ñÈ¡²¿·ÖÊý¾Ý»á³öÏÖ´íÎó£¬ Webjx.Com // 4 (Íê³É) Êý¾Ý½ÓÊÕÍê±Ï,´Ëʱ¿ÉÒÔͨ¹ýͨ¹ýresponseBodyºÍresponseText»ñÈ¡ÍêÕûµÄ»ØÓ¦Êý¾Ý if (xmlhttp.readyState == 4){ document.frmTest.myButton.disabled = false; // ÊôÐÔ£ºresponseBody // ·µ»ØÄ³Ò»¸ñʽµÄ·þÎñÆ÷ÏìÓ¦Êý¾Ý // Óï·¨£ºstrValue = oXMLHttpRequest.responseBody; // ±¸×¢£º±äÁ¿£¬´ËÊôÐÔÖ»¶Á£¬ÒÔunsigned array¸ñʽ±íʾֱ½Ó´Ó·þÎñÆ÷·µ»ØµÄδ¾½âÂëµÄ¶þ½øÖÆÊý¾Ý¡£ alert(xmlhttp.responseBody); // ÊôÐÔ£ºresponseStream // ÒÔAdo Stream¶ÔÏóµÄÐÎʽ·µ»ØÏìÓ¦ÐÅÏ¢ Webjx.Com // Óï·¨£ºstrValue = oXMLHttpRequest.responseStream; // ±¸×¢£º±äÁ¿£¬´ËÊôÐÔÖ»¶Á£¬ÒÔAdo Stream¶ÔÏóµÄÐÎʽ·µ»ØÏìÓ¦ÐÅÏ¢¡£ alert(xmlhttp.responseStream); // ÊôÐÔ£ºresponseText // ½«ÏìÓ¦ÐÅÏ¢×÷Ϊ×Ö·û´®·µ»Ø // Óï·¨£ºstrValue = oXMLHttpRequest.responseText; // ±¸×¢£º±äÁ¿£¬´ËÊôÐÔÖ»¶Á£¬½«ÏìÓ¦ÐÅÏ¢×÷Ϊ×Ö·û´®·µ»Ø¡£XMLHTTP³¢ÊÔ½«ÏìÓ¦ÐÅÏ¢½âÂëΪUnicode×Ö·û´®£¬ // XMLHTTPĬÈϽ«ÏìÓ¦Êý¾ÝµÄ±àÂ붨ΪUTF-8£¬Èç¹û·þÎñÆ÷·µ»ØµÄÊý¾Ý´øBOM(byte-order mark)£¬XMLHTTP¿É // ÒÔ½âÂëÈκÎUCS-2 (big or little endian)»òÕßUCS-4 Êý¾Ý¡£×¢Ò⣬Èç¹û·þÎñÆ÷·µ»ØµÄÊÇxmlÎĵµ£¬´ËÊô ÍøÒ³½ÌÑ§Íø // ÐÔ²¢²»´¦ÀíxmlÎĵµÖеıàÂëÉùÃ÷¡£ÄãÐèҪʹÓÃresponseXMLÀ´´¦Àí¡£ alert(xmlhttp.responseText); // ÊôÐÔ£ºresponseXML // ½«ÏìÓ¦ÐÅÏ¢¸ñʽ»¯ÎªXml Document¶ÔÏó²¢·µ»Ø // Óï·¨£ºvar objDispatch = oXMLHttpRequest.responseXML; // ±¸×¢£º±äÁ¿£¬´ËÊôÐÔÖ»¶Á£¬½«ÏìÓ¦ÐÅÏ¢¸ñʽ»¯ÎªXml Document¶ÔÏó²¢·µ»Ø¡£Èç¹ûÏìÓ¦Êý¾Ý²»ÊÇÓÐЧµÄXMLÎĵµ£¬ // ´ËÊôÐÔ±¾Éí²»·µ»ØXMLDOMParseError£¬¿ÉÒÔͨ¹ý´¦Àí¹ýµÄDOMDocument¶ÔÏó»ñÈ¡´íÎóÐÅÏ¢¡£ alert("Result = " + xmlhttp.responseXML.xml); ÍøÒ³½ÌÑ§Íø // ÊôÐÔ£ºstatus // ·µ»Øµ±Ç°ÇëÇóµÄhttp״̬Âë // Óï·¨£ºlValue = oXMLHttpRequest.status; // ·µ»ØÖµ£º³¤ÕûÐαê×¼http״̬Â룬¶¨ÒåÈçÏ£º // Number:Description // 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״̬Âë,´ËÊôÐÔ½öµ±Êý¾Ý·¢ËͲ¢½ÓÊÕÍê±Ïºó²Å¿É»ñÈ¡¡£ alert(xmlhttp.status); // ÊôÐÔ£ºstatusText // ·µ»Øµ±Ç°ÇëÇóµÄÏìÓ¦ÐÐ״̬ // Óï·¨£ºstrValue = oXMLHttpRequest.statusText; // ±¸×¢£º×Ö·û´®£¬´ËÊôÐÔÖ»¶Á£¬ÒÔBSTR·µ»Øµ±Ç°ÇëÇóµÄÏìÓ¦ÐÐ״̬,´ËÊôÐÔ½öµ±Êý¾Ý·¢ËͲ¢½ÓÊÕÍê±Ïºó²Å¿É»ñÈ¡¡£ alert(xmlhttp.statusText); } } //--> </script> </head> <body> <form name="frmTest"> <input name="myButton" type="button" value="Click Me" onclick="PostOrder('http://localhost/example.htm');"> </form> </body> </html> |






ÎÄÕÂÆÀÂÛ
¹²ÓÐ 0 Î»ÍøÓÑ·¢±íÁËÆÀÂÛ ²é¿´ÍêÕûÄÚÈÝ