XMLHttpRequest 고급 기능
Language/JAVASCRIPT 2013. 4. 29. 19:40.NET Framework 3.0
Internet Explorer 10 및 JavaScript를 사용하는 Windows 스토어 앱은 새로운 표준에 대한 지원을 확장하고 일반적인 개발자 시나리오를 손쉽게 지원할 수 있도록 XMLHttpRequest 개체의 몇 가지 고급 기능을 제공합니다. 여기에는 다음과 같은 기능이 포함됩니다.
- 플러그 인을 사용하지 않고 이미지, 동영상 및 오디오와 같은 이진 파일을 다운로드 및 업로드합니다.
- 플러그 인을 사용하지 않고 멀티미디어 콘텐츠 스트리밍을 다운로드합니다.
- XMLHttpRequest 작업 상태를 더 잘 관찰합니다.
- 다른 브라우저와의 상호 운용성을 개선합니다.
이러한 변경 내용은 다음 섹션에서 자세히 설명합니다.
이진 개체 업로드 및 다운로드
Internet Explorer 10에서는 XMLHttpRequest를 확장하여 이진 데이터를 지원합니다. 부분적으로 이 작업을 위해 파일 API 사양의 BLOB 인터페이스 지원을 추가합니다.
XMLHttpRequest 개체의 responseType 속성을 "blob"로 설정하면 요청과 관련된 데이터가 이진 데이터로 처리됩니다. 이 경우 다운로드 요청(예: GET)의 응답 속성 값에 영향을 줍니다.
다음 예제는 XMLHttpRequest를 사용하여 이미지를 BLOB 개체로 다운로드한 다음 그 결과를 웹 페이지의 이미지 요소에 할당하는 방법을 보여 줍니다.
var req = new XMLHttpReqest(); xhr.open("GET", "download?name=" + name, true); xhr.responseType = "blob"; xhr.onreadystatechange = function () { if (xhr.readyState == xhr.DONE) { var blob = xhr.reponse; var image = document.getElementById("my-image"); image.addEventListener("load", function (evt) { URL.revokeObjectURL(evt.target.src); } image.src = URL.createObjectURL(blob); } } xhr.send();
다운로드 요청에 대해 responseType 속성을 "ms-stream"으로 설정하면 다음 예제와 같이 콘텐츠를 즉석에서 처리할 수 있습니다.
var req = new XMLHttpReqest(); xhr.open("GET", "download?name=" + name, true); xhr.responseType = "ms-stream"; xhr.onreadystatechange = function () { if (xhr.readyState == xhr.LOADING) { var stream = xhr.reponse; var video = document.getElementById("my-video"); video.addEventListener("loadeddata", function (evt) { URL.revokeObjectURL(evt.target.src); } video.src = URL.createObjectURL(stream); } } xhr.send();
Comet 스트리밍 지원
Internet Explorer 10에서는 다음 예제와 같이 XMLHttpRequest 요청에 대한 응답을 로드하는 동안 responseText 속성을 읽을 수 있도록 하여 multipart HTTP 스트리밍(Comet 스트리밍이라고도 함)을 지원합니다.
xhr.open("GET", url); xhr.timeout = timeout; xhr.onreadystatechange = function() { if (this.readyState >= 3 && this.status == 200) { var content = this.responseText; handleContent(content); } } xhr.send();
이전 Windows Internet Explorer 버전에서는 readyState 속성이 done으로 설정된 경우에만 responseText 속성을 읽을 수 있습니다.
responseText 속성은 현재까지 읽은 응답의 전체 값을 반환합니다. 응답이 수신될 때 개별 응답 패킷을 처리하려면 다음 예제와 같이 progress 이벤트(다음 섹션에 설명됨)를 사용하거나 각 readyStateChange 이벤트 반복의 responseText 길이를 추적할 수 있습니다.
xhr.open("GET", url); xhr.timeout = timeout; xhr.onreadystatechange = function() { if (typeof this.index == "undefined") this.index = 0; if (this.readyState >= 3 && this.status == 200) { var content = this.responseText; handleContent( content.substring(this.index) ) this.index = content.length; } } xhr.send();
고급 이벤트 지원
Internet Explorer 10에서는 XMLHttpRequest 개체를 확장하여 XMLHttpRequest 수준 2 사양에 지정된 다음 이벤트를 지원합니다.
이벤트 | 설명 |
---|---|
loadstart |
요청이 시작될 때 발생합니다. |
progress |
요청이 데이터를 보내거나 받는 동안 서버에서 정의된 간격으로 발생합니다. |
abort |
요청이 취소될 때(예: abort() 메서드가 호출될 때) 발생합니다. |
error |
요청이 실패할 때 발생합니다. |
load |
요청이 성공적으로 완료될 때 발생합니다. |
timeout |
작성자가 지정한 기간이 경과할 때 발생합니다. |
loadend |
성공 여부에 관계없이 요청이 완료될 때 발생합니다. |
XMLHttpRequest 개체의 이벤트 처리는 다음 예제와 같이 DOM 이벤트 수준 3 사양 및 진행률 이벤트 사양에 지정된 모델을 따릅니다.
var xhr = new XMLHttpRequest(); var url = "some-url"; xhr.timeout = 5000; xhr.addEventListener("timeout", handleTimeout(evt), false); xhr.onprogress = function(evt) { handleEvent("data: " + this.responseText); // Calculate progress var str = ""; if (evt.lengthComputable) { var percent = 100 * evt.loaded / evt.total; str = percent + "%. Current total size: " + this.responseText.length); } else { str = "Progress unknown. Current total size: " + this.responseText.length; } updateProgress(str); } xhr.open("GET", url); xhr.send();
XMLHttpRequest에 대한 CORS(Cross-Origin Resource Sharing)
Internet Explorer 10에서는 XMLHttpRequest(XHR) 개체와 관련하여 CORS(Cross-Origin Resource Sharing)를 새롭게 지원합니다. CORS(Cross-Origin Resource Sharing) 사양에 정의된 CORS는 HTTP 헤더를 사용하여 대개 동일한 사이트 출처 정책으로 제한되는 도메인 간 웹 요청을 가능하게 합니다.
기본적으로 동일한 사이트 출처 정책은 웹 사이트가 다른 도메인에 있는 서버의 리소스를 요청하지 못하도록 합니다. 그러나 XMLHttpRequest(XHR) 요청에 대한 CORS를 지원하는 브라우저는 적절한 관리자가 해당 요청을 허용하도록 선택할 경우 다른 도메인의 리소스에 액세스할 수 있습니다.
웹 페이지가 XHR request를 수행하면 Internet Explorer에서 원본 헤더를 대상 서버로 보냅니다. 헤더에는 요청의 프로토콜 체계(http:// 또는 https://) 및 요청하는 웹 페이지의 호스트 이름이 포함됩니다. 대상 서버는 요청을 승인할 경우 Access-Control-Allow-Origin 헤더를 반환하며 요청을 처리할 수 있습니다.
이제 XMLHttpRequest 개체가 XHR 요청에 권한 부여 메커니즘을 포함할 수 있게 하는 withCredentials 속성을 지원합니다. 자세한 내용은 XMLHttpRequest 수준 2 사양을 참조하세요.
다음 예제와 같이 withCredentials 속성을 사용하여 CORS 지원을 검색할 수 있습니다.
var url = "http://contoso.com/services/" if( window.XMLHttpRequest ) { var oReq = new XMLHttpRequest(); if( oReq.withCredentials == undefined ) { oReq.open("GET", url, true); oReq.onload = handleResponse(); oReq.send( null ); } else { // CORS not support. Handle fallback } } else { // XMLHttpRequest not supported; handle fallback }
CORS의 실습 데모는 IE 테스트 드라이브의 실습: 사이트 간 업로드(영문)를 참조하세요.
관련 항목
'Language > JAVASCRIPT' 카테고리의 다른 글
prototypejs (0) | 2013.11.13 |
---|---|
마우스 커서 포지션 이동 (0) | 2013.05.22 |
XMLHttpRequest Level 2 (0) | 2013.04.29 |
XMLHttpRequest (0) | 2013.04.29 |
자바스크립트 (0) | 2013.02.22 |