XMLHttpRequest 㯠JavaScript ã§ HTTP ãªã¯ã¨ã¹ããè¡ãããã®çµã¿è¾¼ã¿ã®ãã©ã¦ã¶ãªãã¸ã§ã¯ãã§ãã
ååã« âXMLâ ã¨ããç¨èªãå«ãã§ãã¾ãããXML å½¢å¼ã ãã§ãªããããããã¼ã¿æ±ããã¨ãã§ãã¾ãããã¡ã¤ã«ãã¢ãããã¼ã/ãã¦ã³ãã¼ããããã鲿ã®è¿½è·¡ãªã©æ§ã ãªãã¨ãã§ãã¾ãã
ç¾å¨ã¯ XMLHttpRequest ãè¥å¹²éæ¨å¥¨ã¨ãããããã¢ãã³ãªã¡ã½ãã fetch ãããã¾ãã
ã¢ãã³webéçºã§ã¯ãXMLHttpRequest ã¯æ¬¡ã®3ã¤ã®çç±ã§ä½¿ããããã¨ãããã¾ãã:
- æ´å²çãªçç±:
XMLHttpRequestããã¤æ¢åã®ã¹ã¯ãªããããµãã¼ãããå¿ è¦ãããå ´å - å¤ããã©ã¦ã¶ããµãã¼ãããå¿ è¦ããããã polyfill ã¯ä½¿ããããªã(e.g. ã¹ã¯ãªããã®ãµã¤ãºãå°ããããã)å ´å
fetchãã¾ã ã§ããªããã¨ããããå ´å. e.g ã¢ãããã¼ãã®é²æã追跡ãããªã©
ãã®ãããªè¦ä»¶ãèãããã¨ãããã¾ããï¼ãããããªã XMLHttpRequest ã«é²ãã§ãã ãããããã§ãªããã°ãFetch ã«é²ãã®ãããã§ãããã
åºæ¬
XMLHttpRequest ã«ã¯2ã¤ã®æä½ã¢ã¼ããããã¾ã: åæã¨éåæã§ãã
å ã«ãã»ã¨ãã©ã®ã±ã¼ã¹ã§ä½¿ãããéåæãè¦ã¦ããã¾ãããã
ãªã¯ã¨ã¹ããããããã«ã¯ã次ã®3ã¹ããããå¿ è¦ã§ã:
-
XMLHttpRequestã使ãã¾ã:let xhr = new XMLHttpRequest(); // ã³ã³ã¹ãã©ã¯ã¿ã¯å¼æ°ãªã -
åæåããã¾ã:
xhr.open(method, URL, [async, user, password])ãã®ã¡ã½ããã¯é常
new XMLHttpRequestã®ããå¾ã§å¼ã°ãããªã¯ã¨ã¹ãã®ã¡ã¤ã³ã®ãã©ã¡ã¼ã¿ãæå®ãã¾ãã:methodâ HTTPã¡ã½ãã. ããã¦ã"GET"ã"POST"ã§ã.URLâ ãªã¯ã¨ã¹ãURLãæååã§ãURL ãªãã¸ã§ã¯ããOKã§ããasyncâ æç¤ºçã«falseãæå®ããã¦ããå ´åããªã¯ã¨ã¹ãã¯åæã«ãªãã¾ããããã«ã¤ãã¦ã¯å¾ã»ã©èª¬æãã¾ããuser,passwordâ ãã¼ã·ã㯠HTTP èªè¨¼ã®ã¦ã¼ã¶ã¨ãã¹ã¯ã¼ãã§ã(å¿ è¦ã«å¿ãã¦).
openå¼ã³åºãã«æ³¨æãã¦ãã ããããã®ååã¨ã¯å¯¾ç §çã«ãæ¥ç¶ããªã¼ãã³ããããã§ã¯ããã¾ããããªã¯ã¨ã¹ããè¨å®ããã ãã§ããããã¯ã¼ã¯å¦çã¯sendå¼ã³åºãã§ã®ã¿å§ã¾ãã¾ãã -
ãããéãã¾ã
xhr.send([body])ãã®ã¡ã½ããã¯æ¥ç¶ããªã¼ãã³ãããªã¯ã¨ã¹ãããµã¼ãã«éä¿¡ãã¾ãããªãã·ã§ã³ã®
bodyãã©ã¡ã¼ã¿ã«ã¯ãªã¯ã¨ã¹ãããã£ãå«ã¾ãã¾ããGETã®ãããªããã¤ãã®ãªã¯ã¨ã¹ãã¡ã½ãã㯠body ãæã¡ã¾ãããã¾ãPOSTãªã©ã¯ãã¼ã¿ããµã¼ãã«éä¿¡ããã®ã«bodyã使ãã¾ããå¾ã»ã©ä¾ãè¦ã¦ããã¾ãã -
å¿çã«å¯¾ããã¤ãã³ãããªãã¹ã³ãã¾ã
ããã3ã¤ããã£ã¨ãåºã使ããã¦ãã¾ã:
loadâ çµæãæºåã§ããã¨ãã404 ã®ãã㪠HTTP ã¨ã©ã¼ãå«ã¿ã¾ããerrorâ ãªã¯ã¨ã¹ããéä¿¡ã§ããªãã£ãã¨ã e.g. ãããã¯ã¼ã¯ãã¦ã³ or URL䏿£progressâ ãã¦ã³ãã¼ãä¸ã«å®æçã«ããªã¬ã¼ããããã¦ã³ãã¼ããããéã確èªã§ãã¾ãã
xhr.onload = function() { alert(`Loaded: ${xhr.status} ${xhr.response}`); }; xhr.onerror = function() { // ãªã¯ã¨ã¹ããã¾ã£ããéä¿¡ã§ããªãã£ãã¨ãã«ã ãããªã¬ã¼ããã¾ãã alert(`Network Error`); }; xhr.onprogress = function(event) { // 宿çã«ããªã¬ã¼ããã¾ã // event.loaded - ãã¦ã³ãã¼ãããããã¤ã // event.lengthComputable = ãµã¼ãã Content-Length ããããéä¿¡ããå ´å㯠true // event.total - ãã¼ã¿ã«ã®ãã¤ãæ°(lengthComputable ã true ã®å ´å) alert(`Received ${event.loaded} of ${event.total}`); };
ããã¯å®å
¨ãªä¾ã§ããä¸ã®ã³ã¼ãã¯ãµã¼ããã /article/xmlhttprequest/example/load ã®URLããã¼ãããé²è¡ç¶æ³ã表示ãã¾ãã:
// 1. new XMLHttpRequest ãªãã¸ã§ã¯ãã使
let xhr = new XMLHttpRequest();
// 2. è¨å®: URL /article/.../load ã«å¯¾ãã GET-ãªã¯ã¨ã¹ã
xhr.open('GET', '/article/xmlhttprequest/example/load');
// 3. ãããã¯ã¼ã¯çµç±ã§ãªã¯ã¨ã¹ãéä¿¡
xhr.send();
// 4. ã¬ã¹ãã³ã¹ãåãåã£ãå¾ã«å¼ã³åºããã¾ã
xhr.onload = function() {
if (xhr.status != 200) { // ã¬ã¹ãã³ã¹ã® HTTP ã¹ãã¼ã¿ã¹ãè§£æ
alert(`Error ${xhr.status}: ${xhr.statusText}`); // e.g. 404: Not Found
} else { // show the result
alert(`Done, got ${xhr.response.length} bytes`); // responseText is the server
}
};
xhr.onprogress = function(event) {
if (event.lengthComputable) {
alert(`Received ${event.loaded} of ${event.total} bytes`);
} else {
alert(`Received ${event.loaded} bytes`); // no Content-Length
}
};
xhr.onerror = function() {
alert("Request failed");
};
ãµã¼ãã¼ãå¿çããã¨ããªã¯ã¨ã¹ããªãã¸ã§ã¯ãã®æ¬¡ã®ããããã£ã§çµæãåãåããã¨ãã§ãã¾ãã:
status- HTTPã¹ãã¼ã¿ã¹ã³ã¼ã(æ°å¤):
200,404,403ãªã©ãHTTP 以å¤ã®å¤±æã®å ´åã¯0ã«ãªãã¾ãã
statusText
ï¼HTTPã¹ãã¼ã¿ã¹ã¡ãã»ã¼ã¸(æåå): é常, 200 ã®å ´å㯠OKã404 ã®å ´å㯠Not Fountã403 ã®å ´å㯠Forbidden ãªã©ã
response(å¤ãã¹ã¯ãªããã¯responseTextã使ç¨ããå ´åãããã¾ã)
ï¼ãµã¼ãã¼ã®ã¬ã¹ãã³ã¹ã
対å¿ããããããã£ã使ç¨ãã¦ã¿ã¤ã ã¢ã¦ããæå®ãããã¨ãã§ãã¾ãã:
xhr.timeout = 10000; // ms ã§ã®ã¿ã¤ã ã¢ã¦ã, ãã㯠10 ç§
ãªã¯ã¨ã¹ããæå®æéå
ã§æåããªãå ´åã¯ãã£ã³ã»ã«ãããtimeout ã¤ãã³ããçºçãã¾ãã
?name=value ã®ãã㪠URL ãã©ã¡ã¼ã¿ã渡ãã¤ã¤ãé©åãªã¨ã³ã³ã¼ãã£ã³ã°ãä¿è¨¼ããã«ã¯ãURL ãªãã¸ã§ã¯ãã使ãã¾ãã:
let url = new URL('https://google.com/search');
url.searchParams.set('q', 'test me!');
// ãã©ã¡ã¼ã¿ `q` ã¯ã¨ã³ã³ã¼ãããã¾ã
xhr.open('GET', url); // https://google.com/search?q=test+me%21
ã¬ã¹ãã³ã¹ã¿ã¤ã
ã¬ã¹ãã³ã¹ã®å½¢å¼ãè¨å®ããã«ã¯ xhr.responseType ã使ãã¾ãã:
""(ããã©ã«ã) â æååã¨ãã¦åå¾,"text"â æååã¨ãã¦åå¾,"arraybuffer"âArrayBufferã¨ãã¦åå¾(ããªããªãã¼ã¿ã«å¯¾ãã¦, ãã£ãã¿ã¼ ArrayBuffer, binary arrays ãåç §),"blob"âBlobãã¨ãã¦åå¾ (ãã¤ããªãã¼ã¿ã«å¯¾ãã¦, ãã£ãã¿ã¼ Blob ãåç §),"document"â XML ããã¥ã¡ã³ãã¨ãã¦åå¾ (XPath ã¨ä»ã® XML ã¡ã½ããã使ããã¨ãã§ãã¾ã),"json"â JSON ã¨ãã¦åå¾ (èªåçã«ãã¼ã¹ããã¾ã).
ä¾ãã°ãJSON ã¨ãã¦ã¬ã¹ãã³ã¹ãåå¾ãã¦ã¿ã¾ããã:
let xhr = new XMLHttpRequest();
xhr.open('GET', '/article/xmlhttprequest/example/json');
xhr.responseType = 'json';
xhr.send();
// ã¬ã¹ãã³ã¹ã¯ {"message": "Hello, world!"}
xhr.onload = function() {
let responseObj = xhr.response;
alert(responseObj.message); // Hello, world!
};
æã®ã¹ã¯ãªããã«ã¯ãxhr.responseText ã xhr.responseXML ããããã£ãããããããã¾ããã
ãããã¯ãæååã XML ããã¥ã¡ã³ããåå¾ããããã«æ´å²çãªçç±ããåå¨ãã¦ãã¾ããæè¿ã§ã¯ãxhr.responseType ã§å½¢å¼ãè¨å®ãã¦ãä¸ã®ããã« xhr.response ãåå¾ããã¹ãã§ãã
Ready states
XMLHttpRequest ã¯ç¶æ³ãé²ãã«ã¤ããç¶æ
ãå¤åãã¾ããç¾å¨ã®ç¶æ
㯠xhr.readyState ã§ã¢ã¯ã»ã¹ã§ãã¾ãã
ãã¹ã¦ã®ç¶æ ã¯ ä»æ§ ã«ããã¾ã:
UNSENT = 0; // åæç¶æ
OPENED = 1; // open ãå¼ã°ãã
HEADERS_RECEIVED = 2; // ã¬ã¹ãã³ã¹ããããåãåã£ã
LOADING = 3; // ã¬ã¹ãã³ã¹ã¯ãã¼ãä¸
DONE = 4; // ãªã¯ã¨ã¹ãå®äº
XMLHttpRequest ãªãã¸ã§ã¯ã㯠0 â 1 â 2 â 3 â ⦠â 3 â 4 ã®é çªã§é·ç§»ãã¾ããç¶æ
3 ã¯ãããã¯ã¼ã¯è¶ãã«ãã¼ã¿ãã±ãããåãåããã³ã«ç¹°ãè¿ããã¾ãã
readystatechange ã¤ãã³ãã使ã£ã¦è¿½è·¡ãããã¨ãã§ãã¾ã:
xhr.onreadystatechange = function() {
if (xhr.readyState == 3) {
// loading
}
if (xhr.readyState == 4) {
// request finished
}
};
readystatechange ãªã¹ãã¼ã¯æ¬å½ã«å¤ãã³ã¼ãã§è¦ã¤ãããã¨ãã§ãã¾ããå½æã¯ load ããã®ä»ã®ã¤ãã³ãããªãã£ãã¨ããæ´å²çãªçç±ã§ãã
æè¿ã§ã¯ load/error/progress ãã³ãã©ã使ãã¾ãã
ãªã¯ã¨ã¹ãã䏿¢ãã
ãªã¯ã¨ã¹ãã¯ãã¤ã§ãçµäºã§ãã¾ããxhr.abort() å¼ã³åºãã¯ãããè¡ãã¾ã:
xhr.abort(); // ãªã¯ã¨ã¹ããçµäºãã
ãã㯠abort ã¤ãã³ããçºçããã¾ãããã㦠xhr.status 㯠0 ã«ãªãã¾ãã
åæãªã¯ã¨ã¹ã
open ã¡ã½ããã®3çªç®ã®ãã©ã¡ã¼ã¿ async ã false ãè¨å®ããã¦ããå ´åããªã¯ã¨ã¹ãã¯åæã«ãªãã¾ãã
ã¤ã¾ããJavaScript ã®å®è¡ã¯ send() ã§æ¢ã¾ããã¬ã¹ãã³ã¹ãè¿ã£ã¦ããã¨ãã«åéããã¾ããalert ã prompt ã³ãã³ãã«ããä¼¼ã¦ãã¾ãã
ãã㯠open ã®3çªç®ã®ãã©ã¡ã¼ã¿ã false ã«æ¸ãæããä¾ã§ã:
let xhr = new XMLHttpRequest();
xhr.open('GET', '/article/xmlhttprequest/hello.txt', false);
try {
xhr.send();
if (xhr.status != 200) {
alert(`Error ${xhr.status}: ${xhr.statusText}`);
} else {
alert(xhr.response);
}
} catch(err) { // onerror ã®ä»£ãã
alert("Request failed");
}
åé¡ãªãè¦ããããããã¾ããããåæå¼ã³åºãã¯ãã£ãã«ä½¿ããã¾ããããªããªãèªã¿è¾¼ã¿ãå®äºããã¾ã§ãã¼ã¸å ã® JavaScript ããããã¯ããããã§ãããã©ã¦ã¶ã«ãã£ã¦ã¯ãã¹ã¯ãã¼ã«ãã§ããªããªãã¾ããã¾ããåæå¼ã³åºãã«æéãããããããã¨ããã©ã¦ã¶ã¯ âãã³ã°ãã¦ããâ web ãã¼ã¸ãéããããææ¡ãããã¨ãããã¾ãã
å¥ãã¡ã¤ã³ããã®ãªã¯ã¨ã¹ããã¿ã¤ã ã¢ã¦ãã®æå®ãªã©ãXMLHttpRequest ã®å¤ãã®é«åº¦ãªæ©è½ã¯åæãªã¯ã¨ã¹ãã§ã¯ä½¿ãã¾ãããã¾ããã覧ã®éãé²è¡ç¶æ³ãããã¾ããã
ãããã£ã¦ãåæãªã¯ã¨ã¹ãã¯ãã¾ã使ãããªãã®ã§ããã以ä¸åãä¸ããªãã§ããã¾ãã
HTTP ããã
XMLHttpRequest ã¯ã«ã¹ã¿ã ãããã®éä¿¡ã¨ã¬ã¹ãã³ã¹ããã®ãããèªã¿åãã両æ¹ãå¯è½ã§ãã
HTTP ãããã«é¢ãã¦ã¯3ã¤ã®ã¡ã½ãããããã¾ãã:
setRequestHeader(name, value)-
æå®ããã
nameã¨valueã®ãªã¯ã¨ã¹ãããããè¨å®ãã¾ããä¾:
xhr.setRequestHeader('Content-Type', 'application/json');ãããã®å¶éããã¤ãã®ãããã¯ãã©ã¦ã¶ã ãã管çãã¦ãã¾ããä¾ãã°ã
RefererãHostã§ãã å®å ¨ãªãªã¹ãã¯ ä»æ§ ã«ããã¾ããã¦ã¼ã¶ã®å®å ¨æ§ããªã¯ã¨ã¹ãã®æ£å½æ§ã®è¦³ç¹ããã
XMLHttpRequestã§ã¯ãããã夿´ãããã¨ã¯è¨±å¯ããã¦ãã¾ããã ```ããããåé¤ãããã¨ã¯ã§ãã¾ããXMLHttpRequestã®ããä¸ã¤ã®ç¹å¾´ã¯setRequestHeaderãåãæ¶ããã¨ã¯ã§ããªãã¨ãããã¨ã§ããä¸åº¦ããããè¨å®ããã¨ããããè¨å®ããã¾ãããããªãå¼ã³åºãã¯ãããã¸ã®æ å ±ã®è¿½å ã§ããã䏿¸ãã§ã¯æãã¾ããã
ä¾:
xhr.setRequestHeader('X-Auth', '123'); xhr.setRequestHeader('X-Auth', '456'); // ãããã¯ãããªãã¾ã: // X-Auth: 123, 456 getResponseHeader(name)-
æå®ããã
name(Set-Cookieã¨Set-Cookie2ã¯é¤ã) ã®ã¬ã¹ãã³ã¹ããããåå¾ãã¾ããä¾:
xhr.getResponseHeader('Content-Type') getAllResponseHeaders()-
Set-Cookieã¨Set-Cookie2ãé¤ãããã¹ã¦ã®ã¬ã¹ãã³ã¹ããããè¿ãã¾ãããããã¯æ¬¡ã®ããã«1è¡ã§è¿å´ããã¾ãã:
Cache-Control: max-age=31536000 Content-Length: 4260 Content-Type: image/png Date: Sat, 08 Sep 2012 16:53:16 GMTãããéã®æ¹è¡ã¯å¸¸ã«
"\r\n"ã§ã(OSã«ä¾åãã¾ãã)ããªã®ã§ãç°¡åã«åã ã®ãããã«åå²ãããã¨ãã§ãã¾ããååã¨å¤ã®ã»ãã¬ã¼ã¿ã¯å¸¸ã«ã³ãã³ã¨ããã«ç¶ãã¹ãã¼ã¹ã§ã": "ãããã¯ä»æ§ã§æ±ºãããã¦ãã¾ãããªã®ã§ãname/value ã®ãã¢ããã¤ãªãã¸ã§ã¯ããåå¾ãããå ´åã¯å°ã JS ãå¿ è¦ã«ãªãã¾ãã
ä¾ãã°ãã®ããã«ãªãã¾ã(2ã¤ã®ãããã®ååãåãå ´åãåè ã®ããããå¾è ã®ãããã§ä¸æ¸ããããæ³å®ã§ã):
let headers = xhr .getAllResponseHeaders() .split('\r\n') .reduce((result, current) => { let [name, value] = current.split(': '); result[name] = value; return result; }, {});
POST, FormData
POST ãªã¯ã¨ã¹ããããã«ã¯ãçµã¿è¾¼ã¿ã® FormData ãªãã¸ã§ã¯ãã使ãã¾ãã
æ§æ:
let formData = new FormData([form]); // ãªãã¸ã§ã¯ãã使ãã¾ãããªãã·ã§ã³ã§ <form> ãæå®ãã¾ã
formData.append(name, value); // ãã£ã¼ã«ãã追å ãã¾ã
ãªãã·ã§ã³ã§ãã©ã¼ã ãã使ããå¿ è¦ã«å¿ã㦠â追å â ãã£ã¼ã«ãã追å ãã¾ãããã®å¾:
xhr.open('POST', ...)âPOSTã¡ã½ããã使ãã¾ãxhr.send(formData)ã§ããã©ã¼ã ããµã¼ãã«éä¿¡ãã¾ã
ä¾:
<form name="person">
<input name="name" value="John">
<input name="surname" value="Smith">
</form>
<script>
// pre-fill FormData from the form
let formData = new FormData(document.forms.person);
// add one more field
formData.append("middle", "Lee");
// send it out
let xhr = new XMLHttpRequest();
xhr.open("POST", "/article/xmlhttprequest/post/user");
xhr.send(formData);
</script>
ãã©ã¼ã 㯠multipart/form-data ã¨ã³ã³ã¼ãã£ã³ã°ã§éä¿¡ããã¾ãã
ãããã¯ãJSON ã好ããªã JSON.stringify ããã¦ãæååã¨ãã¦éä¿¡ãã¾ãã
ããã Content-Type: application/json ãè¨å®ããã®ãå¿ããªãã§ãã ãããå¤ãã®ãµã¼ããµã¤ãå´ã®ãã¬ã¼ã ã¯ã¼ã¯ã¯ããã§èªåçã« JSON ããã³ã¼ãããã¾ãã:
let xhr = new XMLHttpRequest();
let json = JSON.stringify({
name: "John",
surname: "Smith"
});
xhr.open("POST", '/submit')
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
xhr.send(json);
.send(body) ã¡ã½ããã¯é常ã«éé£ã§ããBlob ã BufferSource ãªãã¸ã§ã¯ããå«ããã»ã¼ãªãã§ãéä¿¡ã§ãã¾ãã
ã¢ãããã¼ãã®é²è¡ç¶æ³
progress ã¤ãã³ãã¯ãã¦ã³ãã¼ãã®æ®µéã§ã®ã¿æ©è½ãã¾ãã
ã¤ã¾ã: ãªã«ãã POST ããã¨ããXMLHttpRequest ã¯æåã«ãã¼ã¿(ãªã¯ã¨ã¹ãããã£)ãã¢ãããã¼ãããæ¬¡ã«ã¬ã¹ãã³ã¹ããã¦ã³ãã¼ããã¾ãã
ãªã«ã大ããªãã®ãã¢ãããã¼ãããå ´åãã¢ãããã¼ãã®é²è¡ç¶æ³ã追跡ãããã¨ã¯ãããããã¨ã®ä¸ã¤ã§ããã§ãããxhr.onprogress ã¯ããã§ã¯å½¹ã«ç«ã¡ã¾ããã
å¥ã®ãªãã¸ã§ã¯ã xhr.upload ãããã¾ããããã¯ã¢ãããã¼ãã¤ãã³ãå°ç¨ã§ã¡ã½ãããæã¡ã¾ããã
ã¤ãã³ãã®ä¸è¦§ã¯ xhr ã¤ãã³ãã«ä¼¼ã¦ãã¾ãããxhr.upload ã¢ãããã¼ãæã«ããããçºçããã¾ãã:
loadstartâ ã¢ãããã¼ãéå§progressâ ã¢ãããã¼ãä¸ã宿çã«çºçãã¾ãabortâ ã¢ãããã¼ã䏿¢errorâ é HTTP ã¨ã©ã¼loadâ ã¢ãããã¼ããæ£å¸¸ã«çµäºtimeoutâ ã¢ãããã¼ãã®ã¿ã¤ã ã¢ã¦ã(timeoutããããã£ãè¨å®ããã¦ããå ´åloadendâ ã¢ãããã¼ããæå/失æé¢ä¿ãªãçµäº
ãã³ãã©ã®ä¾ã§ã:
xhr.upload.onprogress = function(event) {
alert(`Uploaded ${event.loaded} of ${event.total} bytes`);
};
xhr.upload.onload = function() {
alert(`Upload finished successfully.`);
};
xhr.upload.onerror = function() {
alert(`Error during the upload: ${xhr.status}`);
};
ããã¯å®éã®ä¾ã§ã: é²è¡ç¶æ³ã示ããã¡ã¤ã«ã®ã¢ãããã¼ãã§ã:
<input type="file" onchange="upload(this.files[0])">
<script>
function upload(file) {
let xhr = new XMLHttpRequest();
// ã¢ãããã¼ãã®é²è¡ç¶æ³ã追跡ãã¾ã
xhr.upload.onprogress = function(event) {
console.log(`Uploaded ${event.loaded} of ${event.total}`);
};
// 追跡å®äº: æåããã失æãã
xhr.onloadend = function() {
if (xhr.status == 200) {
console.log("success");
} else {
console.log("error " + this.status);
}
};
xhr.open("POST", "/article/xmlhttprequest/post/upload");
xhr.send(file);
}
</script>
ã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ã
XMLHttpRequest ã¯ãfetch ã¨åã CORS ãã·ãã¼ã使ç¨ãã¦ãã¯ãã¹ãã¡ã¤ã³ãªã¯ã¨ã¹ããä½ããã¨ãã§ãã¾ãã
fetch ã®ããã«ãããã©ã«ãã§ã¯ Cookie 㨠HTTP èªè¨¼ãå¥ã®ãªãªã¸ã³ã¸ã¯éä¿¡ãã¾ãããæå¹ã«ããã«ã¯ãxhr.withCredentials ã true ã«ãã¾ã:
let xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open('POST', 'http://anywhere.com/request');
...
ã¯ãã¹ãªãªã¸ã³ãããã«é¢ãã¦ã®è©³ç´°ã¯ãã£ãã¿ã¼ Fetch: ã¯ãã¹ãªãªã¸ã³(Cross-Origin) ãªã¯ã¨ã¹ã ãåç §ãã¦ãã ããã
ãµããª
XMLHttpRequest ã使ç¨ãã GET ãªã¯ã¨ã¹ãã®å
¸åçãªã³ã¼ã:
let xhr = new XMLHttpRequest();
xhr.open('GET', '/my/url');
xhr.send();
xhr.onload = function() {
if (xhr.status != 200) { // HTTP error?
// ã¨ã©ã¼å¦ç
alert( 'Error: ' + xhr.status);
return;
}
// xhr.response ã§ã¬ã¹ãã³ã¹åå¾
};
xhr.onprogress = function(event) {
// é²è¡ç¶æ³ã®å ±å
alert(`Loaded ${event.loaded} of ${event.total}`);
};
xhr.onerror = function() {
// é HTTP ã¨ã©ã¼ã®å¦ç(e.g. ãããã¯ã¼ã¯ãã¦ã³)
};
宿½ã«ã¯ããå¤ãã®ã¤ãã³ãããããç¾å¨ã®ä»æ§ ã§ãªã¹ãããã¦ãã¾ã(ã©ã¤ããµã¤ã¯ã«é ):
loadstartâ ãªã¯ã¨ã¹ããéå§ãããprogressâ ã¬ã¹ãã³ã¹ã®ãã¼ã¿ãã±ãããå°çãããã®æç¹ã®ã¬ã¹ãã³ã¹æ¬æå ¨ä½ã¯responseTextã«ããã¾ãabortâ ãªã¯ã¨ã¹ããxhr.abort()å¼ã³åºãã«ãããã£ã³ã»ã«ãããerrorâ æ¥ç¶ã¨ã©ã¼ãçºçãe.g. ééã£ããã¡ã¤ã³åãªã©. 404 ãªã©ã®HTTPã¨ã©ã¼ã§ã¯çºçãã¾ãããloadâ ãªã¯ã¨ã¹ããæ£å¸¸ã«çµäºããtimeoutâ ã¿ã¤ã ã¢ã¦ãã§ãªã¯ã¨ã¹ãããã£ã³ã»ã«ããã(ã¿ã¤ã ã¢ã¦ããè¨å®ãããå ´åã®ã¿)).loadendâload,error,timeoutorabortã®å¾ã«çºçãã¾ãã.
error, abort, timeout, 㨠load ã¤ãã³ãã¯ç¸äºã«æä»çã§ãããããã®1ã¤ã ããçºçãã¾ãã
æã使ããã¦ããã¤ãã³ãã¯ãã¼ãå®äº (load), ãã¼ã失æ(error)ã§ãããããã¯ãåä¸ã® loadend ãã³ãã©ã使ç¨ãã¦ä½ãèµ·ãã£ãã®ãã確èªããããã«ã¬ã¹ãã³ã¹ããã§ãã¯ãã¾ãã
ãã§ã«å¥ã®ã¤ãã³ã readystatechange ãè¦ã¦ãã¾ãããæ´å²çã«ã¯ã仿§ãå®ã¾ããã£ã¨åããããã¾ãããæè¿ã§ã¯ãããã使ãå¿
è¦ã¯ããã¾ãããæ°ããã¤ãã³ãã«ç½®ãæãããã¨ãã§ãã¾ãããå¤ãã®å ´åãå¤ãã¹ã¯ãªããã«ããã¾ãã
ç¹ã«ã¢ãããã¼ãã追跡ããå¿
è¦ãããå ´åã¯ãxhr.upload ãªãã¸ã§ã¯ãã§åãã¤ãã³ãããªãã¹ã³ããå¿
è¦ãããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã