Recent Posts
Recent Comments
Link
11-21 14:38
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

Ajax 본문

DEV&OPS/Javascript

Ajax

ALEPH.GEM 2022. 3. 12. 21:57

 

Ajax

Ajax는 XMLHttpRequest 객체를 이용하여 웹서버와 비동기 통신하고 XML이나 JSON을 통해 DOM을 동적으로 갱신하는 기법을 말합니다.

 

XMLHttpRequest 

프로퍼티
  • readyStateHTTP : 통신 상태(0~4) , 읽기 전용
  • response : 응답 내용, 읽기 전용
  • responseText : 응답 내용을 텍스 형식으로 가져 옴, 읽기 전용
  • responseType : 응답 타입, 쓰기 가능
  • responseXML : 응답 내용을 XMLDocument 객체로 가져옴, 읽기 전용
  • status : HTTP 상태 코드, 읽기 전용
  • statusText : 요청 상태 보충 메시지, 읽기 전용
  • timeout : 요청을 끝내는데 걸릴 시간을 가져오거나 설정, 쓰기 가능
  • withCredentials : 크로스 오리진 통신에 대해 인증 정보를 사용할지를 뜻하는 Boolean, 쓰기 가능
  • onreadystatechange : readyState값이 바뀔 때마다 호출되는 이벤트 처리기, 쓰기 가능
  • ontimeout : 요청 시간이 초과할 때마다 호출되는 이벤트 처리기, 쓰기 가능
메서드
  • abort() : 현재 비동기 통신을 중단
  • getAllResponseHeaders() : 통신 성공시 수신한 모든 HTTP 응답 헤더를 획득
  • getResponseHeader(header) : 통신 성공시 특정 HTTP 응답 헤더를 획득
  • open() : HTTP 요청을 초기화
  • send(data) : HTTP 요청을 보냄
  • setRequestHeader(header, value) : 요청 헤더에 정보를 추가
readyState
  • 0 : 초기화되지 않음
  • 1 : 로드중
  • 2 : 로드 완료
  • 3 : 응답 수신 중
  • 4 : 수신 완료
주요 이벤트
  • abort : 요청 취소시 발생
  • error : 요청 실패시 발생
  • loadend : 요청 완료시 발생
  • load : 요청 성공 후 응답이 리턴되었을 때 발생
  • loadstart : start 요청을 보낼 때 발생
  • progress : 데이터를 주고받는 중에 발생
  • timeout : 요청 시간을 초과했을 때

 

ajax 통신

req.open(method, url, [,async [,user [,password]]]);

method : HTTP 메서드, GET or POST

url : 요청할 URL

async : 비동기 통신 여부(생략하면 비동기)

user, password : 인증이 필요한 경우에 사용

 

아래 예제는 Open api를 호출해서 공인아이피 결과값을 출력해주는 예제입니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title> </title>
</head>
<body>
    <div id="view"></div>
    <script>
        /* 해당 사이트의 응답 콜백 함수 이름이 callback(JSON)이기 때문에 이 콜백 함수의 동작을 정의 */
        function callback(data){
            console.log(data);
            console.log("ip: "+data.ip);
        }

        window.onload = function(){
            /* 요청 */
            var req = new XMLHttpRequest();
            var jsonObj;
            var jsonText;
            /* 요청이 완료되어 응답을 받은 상태(load) 시 발생한 이벤트에 실행할 리스너를 정의 */
            req.addEventListener("load", function(){
                /* 문서 화면에 표시 */
                document.getElementById("view").innerHTML = req.responseText;
                /* 응답 상태 : 200 정상 */
                console.log(req.status);
                /* 준비 상태 : 4 수신완료 */
                console.log(req.readyState);
                /* 응답값을 TEXT로 처리할 경우 */        
                jsonText = req.responseText;
                jsonText = jsonText.replace("callback","");
                jsonText = jsonText.replace("(","");
                jsonText = jsonText.replace(");","");
                jsonObj = JSON.parse(jsonText);
                console.log("Text: "+jsonObj.ip);
                /* 해당 사이트는 응답 값이 콜백함수로 된 jsonp로 오기 때문에 */
                /* script element를 생성 */
                var script = document.createElement("script");
                /* 응답 값(콜백함수 호출)을 스크립트 element에 추가하면 위에서 정의된 콜백함수가 실행 됨. */ 
                script.innerText = req.response;
                document.getElementsByTagName("head")[0].appendChild(script);
            }, false);
            req.responseType = "jsonp";
            req.open("GET", "https://api.ipify.org?format="+encodeURIComponent("jsonp"));
            req.send(null);
        };
    </script>
</body>
</html>

POST로 요청할 때에는 아래와 같이 content-type을 바꿔줘야합니다.

req.setRequestHeader("content-type", "application/x-www-form-urlencoded");
req.open("POST", "https://api.ipify.org");
req.send("format="+encodeURIComponent("jsonp"));

POST 요청과 응답은 DOMString, FormData, ArrayBufferView, Blob, Document 등을 주고 받을 수 있습니다.

 

 

크로스 오리진 통신

XMLHttpRequest는 동일 출처 정책을 준수하지만 JSONP, CORS, postMessage 기법으로 크로스 오리진 통신을 할 수 있습니다.

이를 이용하여 위 예제처럼 다른 웹사이트의 서비스를 가져와서 구현할 수 있습니다.

 

JSONP

P는 padding을 뜻하고 JSON데이터에 함수 이름을 추가했다는 뜻이 담겨있습니다.

위의 예제에서는 JSON데이터를 callback({ip:"x.x.x.x"}); 함수의 인수로 지정한 JSONP 데이터가 들어있습니다.

클라이언트에서는 이벤트가 발생했을 때 DOM을 사용해서 script 요소를 생성해서 그 내용을 script 요소에 추가합니다. 그 때 만약 콜백 함수(JSONP)의 동작이 미리 정의되어 있다면 그 콜백함수가 실행이 되게 됩니다.  

<div>태그의 내용을 보면 아시겠지만, 해당 JSONP 데이터 자체가 callback(JSON); 을 실행하라는 동작이기 때문입니다.

 

postMessage

HTML5에 추가된 Window객체의 postMessage 메서드를 사용하여 부모, 자식 윈도우끼리 메시지를 비동기적으로 주고받을 수 있습니다.

target.postMessage(message, origin);

target : 메시지를 받을 윈도우 객체

message : 보내는 메시지(브라우저에 따라 문자열만 보낼수 있는 경우도 있음)

origin : 메시지를 받을 윈도우 출처 URL

 

메시지를 받은 윈도우의 내용에 message이벤트 리스너를 만들어 두면 이벤트 리스너 안에서 메시지를 받을 수 있습니다.

window.addEventListener("message", function(e){
    console.log("메시지 수신");
}, false);

 

 

 

 

 

 

 

 

 

728x90

'DEV&OPS > Javascript' 카테고리의 다른 글

javascript 드래그 앤 드롭  (0) 2022.03.17
javascript class  (0) 2022.03.15
javascript 비동기 처리 Promise  (0) 2022.03.12
javascript event  (0) 2022.03.11
javascript DOM tree  (0) 2022.03.06