: XHR(XML Http Request) 혹은 Ajax(Asynchronous Javascript And XML) 이라 함.
- XHR은 현재 페이지 변화없이 비동기적으로 특정 요청을 보내고 응답을 받기 위해 존재하는 기술이다.
- XMLHttpReqeust 타입의 객체를 통해 접근한다.
const xhr = new XMLHttpRequest(); // 객체화
<body> <button class="button" id="requestButton">IP주소 확인하기</button> <span class="ip" id="ipValue">아직 확인하지 않았습니다.</span> <br> <input value="페이지가 변하지 않았다는 증거"> </body>
- 해당 Html으로 공부해보자.
: XMLHttpRequest 객체의 준비 상태 중 하나로, 객체화가 이루어진 직후 상태이다. 정수형으로 0으로 표시한다.
: XMLHttpRequest 객체에 대해 open() 메서드를 호출한 직후의 상태이다.
: XMLHttpRequest 객체에 대해 send() 메서드를 호출한 직후, 서버와의 핸드 셰이크(Hand-Shake)가 이루어진 상황이다.
8분 완료된 상황은 아니고 서로에 대해서 알고 있는 상황
: 요청에 대한 응답값을 받아오고 있는 상황.
- 물을 떠오고 있는 상황
: 요청과 응답이 모두 종료된 상황
- 물을 떠와서 건내주면 종료
이 5개의 상황이 변할 때 함수를 onreadystatechange에 때려 넣는다.
: XMLHttpRequest 객체의 상태가 변화했을 때 실행할 함수를 지정한다.
: XMLHttpRequest 객체의 준비 상태이다.
: XMLHTttpRequest 객체의 HTTP 상태 코드이다. (200,400,403, 404, 405,
500 등)
: XMLHttpRequest 객체가 가지고 있는 문자열 응답 결과 내용이다.
: 전달된 m타입의 방식(Method)으로 t주소에 요청을 보낸다고 설정.
const requestButton = window.document.getElementById('requestButton'); requestButton.addEventListener('click', ()=> { const xhr = new XMLHttpRequest(); // 객체화 xhr.open('GET', 'http://api.ipify.org/'); });
- 이렇게 쓴다고 요청이 나가는 것은 아니다.
: 준비된 HTTPXMLHttpRequest 객체에 대해 실제 요청을 전송한다. 이떄 f는 같이 전송할 데이터로, 없어도 상관없음
if (xhr.readyState === XMLHttpRequest.DONE) {}
if (xhr.readyState === 4) {}
- 요청에 대한 응답이 끝났니? 라고 물어보는 것.
- 200 / 404 둘다 완료 상황임으로 DONE 가지고 이 두개중에 어떤 방식으로 끝났는지는 알 수 없다. 아래로 가자.
if (xhr.status >= 200 && xhr.status < 300)
우리가 보낸 요청이 정상적으로 돌아왔다면
- 이렇게 까지 작성했을 때 요청 보낸 적이 없기 떄문에
onreadystatechange
을 하더라도 아무런 일도 발생하지 않느다.xhr.send();
- xhr.send(); 가 onreadystatechange 하기 전에 먼저 실행이 된다.
- 이제 버튼을 누르게 되면 ip주소가 불러와지게 된다.
<srcipt> const requestButton = window.document.getElementById('requestButton'); const ipValue = window.document.getElementById('ipValue'); requestButton.addEventListener('click', ()=> { ipValue,innerText = '잠시만 기다려 주세요...'; const xhr = new XMLHttpRequest(); // 객체화 xhr.open('GET', 'http://api.ipify.org/'); xhr.onreadystatechange = () => { if (xhr.readyState === XMLHttpRequest.DONE) { // 요청에 대한 응답이 끝났니? 라고 물어본다. let ip; if (xhr.status >= 200 && xhr.status < 300) { const responseText = xhr.responseText; ip = responseText; } else { ip = `[${xhr.status}] IP 주소를 불러오지 못했습니다.`; } ipValue.innerText = ip; } }; xhr.send(); }); </srcipt>
const xhr = new XMLHttpRequst();
xhr.open(메서드, 주소);
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
if(xhr.status >= 200 && xhr.status < 300) {
// 성공 로직
} else {
// 실패 로직
}
}
};
xhr.send();