XMLHttpRequset(XHR)은 웹브라우저와 웹 서버 간에 메소드가 데이터를 전송하는 객체 폼의 API이며, 비동기 통신을 위해서 브라우저에서 제공하는 객체, 즉 Web API이다.
그러므로 브라우저의 자바스크립트 환경에서만 사용할 수 있다.
브라우저는 주소창이나 HTML 자체에서도 HTTP전송 기능을 제공하긴한다, form 태그 또는 a 태그가 그것이다.
자바스크립트를 사용하여 HTTP요청을 전송하기 위해서 XMLHttpRequest객체를 사용하는 것이다.
// XMLHttpRequest 객체의 생성
const xhr = new XMLHttpRequest()
XMLHttpRequest객체는 다양한 프로프티와 메서드를 제공한다.
다양한 항목들이 있지만 중요한 프로퍼티와 메서드들은 다음과 같다.
프로토타입 프로퍼티 | 설명 |
---|---|
readyState | HTTP 요청의 현재 상태를 나타내는 정수. 다음과 같은 XMLHttpRequest의 정적 프로퍼티를 값으로 갖는다. - UNSENT : 0 - OPEND : 1 - HEADERS_RECEIVED : 2 - LOADING : 3 - DONE : 4 |
status | HTTP 요청에 대한 응답상태(HTTP상태 코드)를 나타내는 정수 예) 200 |
statusText | HTTP요청에 대한 응답 메시지를 나타내는 문자열 예) "OK" |
responseType | HTTP응답 타입 예) document, json, text, blob, arraybuffer |
response | HTTP요청에 대한 응답 몸체.reponseType에 따라 타입이 다르다. |
이벤트 핸들러 프로퍼티 | 설명 |
---|---|
onreadystatechange | readyState프로퍼티 값이 변경된 경우 |
onerror | HTTP요청에 에러가 발생한 경우 |
onload | HTTP요청이 성공적으로 완료한 경우 |
메서드 | 설명 |
---|---|
open | HTTP 요청 초기화 |
send | HTTP 요청 전송 |
abort | 이미 전송된 HTTP요청 중단 |
setRequestHeader | 특정 HTTP요청 헤더의 값을 설정 |
정적 프로퍼티 | 설명 |
---|---|
DONE | 서버 응답완료 |
//예시
// XMLHttpRequest 객체 생성
const xhr = new XMLHttpRequest();
// HTTP 요청 초기화
xhr.open('GET','/users');
// HTTP 요청 헤더 설정
// 클라이언트가 서버로 전송할 데이터의 MIME 타입 지정 : json
xhr.setRequestHeader('content-type', 'aplication/json');
// HTTP 요청 전송
xhr.send();
open메서드는 서버에 전송할 HTTP요청을 초기화 한다.
xhr.open(method, url[, async])
매개변수 | 설명 |
---|---|
methd | HTTP 요청 메서드 ("GET","POST","PUT","DELETE" 등) |
url | HTTP 요청을 전송할 URL |
async | 비동기 요청 여부. 옵션으로 기본값은 true이며, 비동기 방식으로 동작한다. |
send 메서드는 open메서드로 초기화된 HTTP 요청을 서버에 전송한다. 기본적으로 서버로 전송하는 데이터는 GET, POST요청 메서드에 따라 전송 방식에 차이가 있다.
// 예
xhr.send(JSON.stringfy({id:1, content:'html', completed: false}));
setRequstHeader 메서드는 특정 HTTP 요청의 헤더 값을 설정한다.
setRequstHeader 메서드는 반드시 open 메서드를 호출한 이후에 호출해야한다.
자주 사용하는 HTTP 요청 헤더에는 Content-type과 Accept가 있다.
MIME 타입 | 서브타입 |
---|---|
text | text/plain, text/html, text/css, text/javascript |
application | appication/json, application/x-www-form-urlencode |
multipart | multipart/fored-data |
xhr.setRequestHeader('accept', 'application/json');
서버가 전송한 응답을 처리하려면 XMLHttpRequest객체가 발생시키는 이벤트를 캐치해야한다.
캐치를 하는데에는 일련의 과정이 있으며 다음과 같다.
const xhr = new XMLHttpRequest();
xhr.open('GET','https:// ....');
xhr.send();
xhr.onreadystatechange = () => {
if (xhr.readyState !== XMLHttpRequest.DONE) return;
}
if (xhr.status === 200) {
console.log(JSON.parse(xhr.reponse));
} else {
console.error('Error', xhr.status, shr.statusText);
}
하지만 이와 같은 과정은 조건문이 많고 조금 번거러운 느낌이 든다. 다음 onload 이벤트 사용하면 조금 축약할 수 있다.
아주 조금... if (xhr.readyState !== XMLHttpRequest.DONE) return; 이것 한 문장 축약한다.
const xhr = new XMLHttpRequest();
xhr.open('GET','https:// ....');
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) {
console.log(JSON.parse(xhr.reponse));
} else {
console.error('Error', xhr.status, shr.statusText);
}
};
참고문헌 : 자바스크립트 딥 다이브, 위키백과