본문 바로가기

Programming/Script

Ajax - XMLHttpRequest

XMLHttpRequest(XHR) 객체는 Internet Explore5에서 ActiveX 컴포넌트 형식으로 가장 먼저 제공되었기때문에, 모질라와 사파리 웹브라우저에서 이 객체를 도입하기전까지 사실 많은 개발자들이 XMLHttpRequest 객체의 사용을 꺼려했다.

XHR은 W3C 표준이 아니기 때문에 브라우저마다 작동방식에 있어서 다소나마 차이가 존재했었지만 현재 대부분의 브라우저들은 XHR 기능을 서로 비슷하게 구현하고 있다. 현존하는 브라우저들 중에서 XHR을 지원하지 않는 브라우저는 거의 없을정도로 대부분의 브라우저들은 현재 XHR 을 지원하고 있다.

ajax 구현의 시작은 XHR 객체의 생성에서 시작한다.

<script language="javascript" type="text/javascript">
    var xmlHttp = new XMLHttpRequest();
</script>

위의 소스는 new 키워드를 사용하여 아주 간단하게 XMLHttpRequest 객체를 생성하였다.

하지만 XHR 은 W3C 의 표준이 아니므로, 인터넷익스플로어에서는 ActiveX Component 형식으로 구현되었고, 그 밖에 다른 브라우저들(FireFox, Safari, Opera)은 native javascript 객체로 구현되었다. 이런 차이점을 고려해서 XHR 객체를 얻어오는 자바스크립트 코드를 다음과 같이 작성할 수 있다.

var xmlHttp;
function createXMLHttpRequest() {
    if (window.ActiveXObject) {
       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
       xmlHttp = new XMLHttpRequest();
    }
}

window.ActiveXObject 는 ActiveXObject를 지원하는 브라우저라면 오브젝트를 리턴하고 그렇지 않다면 null를 리턴하게 된다.
따라서 오브젝트가 존재하면 if 구문은 true 를 반환하고 xmlHttp 값은 ActiveXObject 객체가 할당되어진다.
if 구문이 false 를 반환하면 else if 구분으로 이동하여 xmlHttp 값은 navtive javascript 객체가 할당될 것이다.
따라서 위 코드를 이용하면 브라우저가 다르더라도 하나의 메소드로 XHR 객체를 생성하여 사용할 수 있다.

 

[ XHR 오브젝트의 메소드 ]

void open(string method, string url, boolean asynch, string username, string password) 
요청을 초기화(새로운 요청을 서버에 설정)한다.
method (필수) - POST, GET, PUT 3가지 중 하나
url (필수) - 요청하고자 하는 서버의 url
asynch (선택) - 요청이 비동기인지 여부를 판단하는 항목
  입력하지 않으면 디폴트로 true 가 설정되어 요청은 비동기로 처리되고, false 로 설정하면 요청은 동기로 처리되기 때문에
  서버에서 응답을 받을때까지 프로세스는 기다리게 된다. 사실 XHR 을 사용하는 가장 큰 이점중의 하나인 비동기 처리를
  위해서는 asynch 항목을 true 로 설정해서 사용해야 한다. false 를 설정한다면 XHR 을 사용하는 이점이 그만큼 줄어든다.

void send(content) - 요청을 서버로 전송
요청이 비동기이면 이 메소드는 바로 리턴되지만 요청이 동기이면 서버에서 응답을 받을때까지 계속 대기한다.
content (선택) - DOM 객체(XML 객체)이거나 input stream, string 값으로 설정할 수 있으며 HttpRequest body 의
  한 부분으로 서버로 전달된다. content 에 값을 넘기려면 open() 메소드는 반드시 POST 로 설정해야 하며,
  GET 방식으로 요청하려면 null 을 설정하면 된다.

void abort() - 요청을 중지한다.

string getAllResponseHeaders() - 요청에 대응되는 응답의 헤더정보를 리턴
  즉, Content-Length, Date, URI 등을 포함하는 헤더정보를 string 형식으로 반환한다.

string getResponseHeader(string header) : 응답의 헤더정보중에서 header 에 대응되는 값을 string 형식으로 반환

 

[ XMR 오브젝트의 속성 ]

readyState - 요청의 상태를 의미(0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, 4 = complete)
onreadystatechange - 자바스크립트 콜백함수(funtion pointer)를 저장한다. 콜백함수는 readyState 값이 변할때 마다
    호출되는데, 요청이 서버로 보내지면 readyState 는 5가지 숫자값으로 계속 변화가 일어나게 된다.
responseText - 서버의 응답을 string 형식으로 나타낸다.
    단순 text를 innerHTML 속성으로 표현하기에는 알맞지만 논리적으로 파싱하거나 동적으로 페이지 컨텐츠를 생성하기는 힘듬
responseXML - 서버의 응답을 XML 로 나타낸다. 이 속성은 DOM 객체로 파싱할 수 있다.
status - 서버로부터의 HTTP 상태코드 (ex - 200(OK), 404(NOT Found), 202(결과 값이 없을 때) 등)
statusText - HTTP 상태코드에 대한 텍스트 값 (ex - OK, NOT Found 등)

 

[ 간단한 XML 소스 예제 ]

simpleRequest.html 

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Simple XMLHttpRequest</title>
<script type="text/javascript">
    var xmlHttp;
    function createXMLHttpRequest() {
        if (window.ActiveXObject) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        else if (window.XMLHttpRequest) {
            xmlHttp = new XMLHttpRequest();
        }
    }

    function startRequest() {
        createXMLHttpRequest();    // XML객체 생성
        xmlHttp.onreadystatechange = handleStateChange;
        xmlHttp.open("GET", "simpleResponse.xml", true);    // GET, 비동기 방식으로 서버에 요청
        xmlHttp.send(null);
    }

    function handleStateChange() {
        if(xmlHttp.readyState == 4) {
            if(xmlHttp.status == 200) {
                alert("The server replied with: " + xmlHttp.responseText);
            }
        }
    }
</script>
</head>

<body>
<form action="#">
    <input type="button" value="Start Basic Asynchronous Request" onclick="startRequest();"/>
</form>
</body>
</html>

simpleResponse.xml 
Hello from the server!

위와 같이 각각의 파일을 생성해 준 후 코드를 실행한다.

실행해 보면 알겠지만 url 대신 simpleResponse.xml 파일을 요청한다. 되도록 단순하게 XHR 의 구동원리를 이해하는 목적에서 서버에 요청을 하고 응답을 받는것 처럼 꾸몄을 뿐이다.

1. 사용자가 버튼을 클릭하면 이벤트가 발생해서 startRequest() 메소드가 실행
2. XHR 객체가 생성 (createXMLHttpRequest()) 되고
    handleStateChange() 콜백함수가 XHR 객체의 onreadystatechange 속성에
    저장(xmlHttp.onreadystatechange = handleStateChange; )된다.
3. GET/비동기 방식으로 서버에 요청을 보내는데, 이때 XHR 객체는 서버의 simpleResponse.xml 파일을 요구한다.
   xmlHttp.open("GET", "simpleResponse.xml", true);
4. 서버는 Ajax 클라이언트의 요청 url 인 simpleResponse.xml 을 찾아서 읽은 후에 string 형식으로 XHR 객체로 보낸다.
5. 콜백메소드는 XHR 의 state 가 변할때 실행되므로 readyState=4 이고 stat=200 일때 결과값을 브라우저에 보낸다.

위의 소스 실행 결과 위와 같은 경고창이 출력됨을 확인 할 수 있다.

 

참조 : http://blog.naver.com/jinoxst/140021512014,
http://www.ibm.com/developerworks/kr/library/wa-ajaxintro2/

 

'Programming > Script' 카테고리의 다른 글

Ajax란?  (0) 2012.04.27
HTML 4.0 Special Entities  (0) 2012.04.16
자주쓰는 공통스크립트  (0) 2012.04.13
div 숨기기 / 보이기  (0) 2012.04.10
하루동안 팝업창 띄우지 않기  (0) 2012.04.10