XMLHttpRequest

μ„œλ²„μ™€μ˜ 비동기 데이터 톡신을 ν•˜κΈ° μœ„ν•΄μ„œ XMLHttpRequest 객체λ₯Ό ν•  수 μžˆλ‹€.
기쑴의 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ajax 을 μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•˜λ‹€.

1. HTTP Request 생성

λͺ¨λ“  λΈŒλΌμš°μ €μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

var xhr
if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
}

2. 응닡 데이터λ₯Ό μ²˜λ¦¬ν•  callback ν•¨μˆ˜λ₯Ό μ •μ˜

var successCallback = function () {
    // μ„œλ²„μ—μ„œ 받은 응닡을 ν”„λ‘œμ„Έμ‹±
}

xhr.onreadystatechange = successCallback;

3. μš”μ²­ (Request) 와 응닡 (Response) 을 μ •μ˜

xhr.open('GET', '/json', true);
xhr.send(null);
  • open Parameter
    • method
      • GET, POST, HEAD
      • λŒ€λ¬Έμž 둜 ν‘œκΈ°ν•˜λŠ” 것을 κΆŒν•œλ‹€ (일뢀 λΈŒλΌμš°μ €μ—μ„œλŠ” λΉ„ λ™μž‘ν•  수 있음)
    • url
      • μš”μ²­ν•  μ„œλ²„μ˜ 경둜λ₯Ό μž…λ ₯ν•œλ‹€.
    • async
      • μˆ˜ν–‰ 방식을 κ²°μ •ν•œλ‹€ (동기 / λΉ„ 동기)
  • send Parameter
    • POST λ°©μ‹μœΌλ‘œ μš”κ΅¬ ν•œ 경우 μ„œλ²„λ‘œ 보낼 데이터λ₯Ό μ •μ˜ν•œλ‹€
    • json , soap ν˜Ήμ€ 쿼리 슀트링으둜 ν‘œν˜„ κ°€λŠ₯

POST 둜 톡신할 경우 μš”μ²­ (request) MINE type을 μ„€μ • ν•΄μ•Ό ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€λ©΄ send λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 μ•„λž˜μ™€ 같은 ν˜•νƒœλ‘œ send 둜 보낼 쿼리λ₯Ό μ΄μš©ν•΄μ•Ό ν•œλ‹€.

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

4. 응닡 데이터 처리

데이터 μš”μ²­ (request) ν•˜μ˜€μ„λ•Œμ˜ 응닡 (response) 처리λ₯Ό ν•΄μ•Ό ν•œλ‹€.

응닡에 μ‚¬μš©λ˜λŠ” callback ν•¨μˆ˜μ—μ„œ XMLHttpRequest κ°μ²΄λŠ” readyState λ‹€μŒκ³Ό 같은 응닡 μš”κ΅¬ μƒνƒœκ°’μ„ 가진닀.

readyState κ°€ κ°€μ§ˆ 수 μžˆλŠ” 응닡 μƒνƒœ κ°’

  • 0 (uninitialized)
    • 객체가 막 μƒμ„±λ˜μ—ˆλ‹€.
    • open λ©”μ†Œλ“œκ°€ μˆ˜ν–‰ λ˜μ§€ μ•Šμ•˜λ‹€.
  • 1 (loading)
    • send λ©”μ†Œλ“œκ°€ μˆ˜ν–‰ λ˜μ§€ μ•Šμ•˜λ‹€.
  • 2 (loaded)
    • send λ©”μ†Œλ“œκ°€ μˆ˜ν–‰ λ˜μ—ˆμ§€λ§Œ μš”μ²­ 헀더λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
  • 3 (interactive)
    • 일뢀 λ°μ΄ν„°λ§Œ μˆ˜μ‹ ν•œ μƒνƒœμ΄λ©°, μƒνƒœ 및 응닡 ν—€λ”λŠ” μ‚¬μš©κ°€λŠ₯
    • μš”μ²­ μˆ˜ν–‰μ€‘
  • 4 (complete)
    • μš”μ²­ν•œ 데이터λ₯Ό μ „λΆ€ 받은 μƒνƒœμ΄λ‹€.
    • μš”μ²­ 및 응닡이 μ™„λ£Œλ¨

λ™μΌν•˜κ²Œ XMLHttpRequest κ°μ²΄λŠ” state λ‹€μŒκ³Ό 같은 μƒνƒœκ°’μ„ 가진닀.

  • 200
    • 정상
  • 403
    • κΆŒν•œ λΆ€μ‘± ν˜Ήμ€ μ ‘κ·Ό κΈˆμ§€
  • 404
    • νŽ˜μ΄μ§€λ₯Ό 찾을 수 μ—†μŒ
var successCallback = function () {
    if (xhr.readState === 4 && xhr.status === 200) {
        console.log('Success');
    } else {
        console.log('Failed');
    }
}

5. μ΅œμ’… μ™„λ£Œ μ½”λ“œ

var xhr = new XMLHttpRequest();
xhr.open('GET', '/json', true);
xhr.onreadystatechange = function (obj) {
    if (xhr.readyState === 4 && xhr.status === 200) {
        /* 성곡 μ½”λ“œ */
        var responseObj = JSON.stringify(xhr.responseText);
    } else {
        /* μ‹€νŒ¨ μ½”λ“œ */
    }
};
xhr.send(null);

ν”„λ‘œκ·Έλž˜μŠ€ λͺ¨λ‹ˆν„°λ§

XMLHttpRequest κ°€ μ§€μ›ν•˜λŠ” nsIJSXMLHttpRequest μΈν„°νŽ˜μ΄μŠ€λŠ” μš”μ²­μ΄ μ²˜λ¦¬λ˜λŠ” λ™μ•ˆ λ°œμƒλ˜λŠ” μ΄λ²€νŠΈκ°€ μˆ˜μ‹  κ°€λŠ₯ν•˜λ©° 주기적인 μ§„ν–‰μƒνƒœ μ•Œλ¦Ό 및 μ—λŸ¬ μ•Œλ¦Ό 등을 확인 κ°€λŠ₯ ν•˜λ‹€

var onProgress = function (e) {
    var percent = (e.position / e.totalSize) * 100;
    ...
}

var onError = function (e) {
    console.log('Error ', e.target.status, ' occurred while receving the document'); 
}

...

var xhr = new XMLHttpRequest();
xhr.open('GET', '/json', true);
xhr.onprogress = onProgress;
xhr.onload = onLoad;
xhr.onerror = onError;
xhr.send(null);

onprogress 의 속성인 position κ³Ό totalSize λŠ” 받은 데이터가 λͺ‡ λ°”μ΄νŠΈμΈμ§€, 전체 데이터 크기가 λͺ‡ λ°”μ΄νŠΈμΈμ§€ 각각 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

λͺ¨λ“  μ΄λ²€νŠΈλŠ” 그에 λŒ€μ‘ν•˜λŠ” XMLHttpRequest λ₯Ό target μ†μ„±μœΌλ‘œ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

CORS κ΄€λ ¨ μ„€μ • 이슈

크둜슀 λ„λ©”μΈκ°„μ˜ μΏ ν‚€ 섀정은 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ •μ±… ν˜Ήμ€ 데이터 λͺ…μ„Έμ˜ 변경을 톡해 ν•΄κ²°ν•œλ‹€.

Request Header ν˜Ήμ€ Body 에 ν•„μš”ν•œ 데이터λ₯Ό μΆ”κ°€ν•˜μ—¬ 보내쀀닀.

$.ajax({
    ...
    beforeSend: function (xhr) {
        xhr.setRequestHeader('param', $.cookie('value'));
    },
    ...
})

jQuery Ajax μ‚¬μš©μ‹œμ—λŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©

$.ajax({
    ...
    xhrFields: { withCredentials: true },
    ...
})

jQuery 1.5.1 μ—μ„œ μΆ”κ°€λœ κΈ°λŠ₯ 으둜 ν•΄λ‹Ή ν•˜μœ„ 버전은 지원 λΆˆκ°€