본문 바로가기
javascript/javascript 고급문법

[javascript] XMLHttpRequest

by 남민섭 2023. 1. 23.
728x90
반응형
반응형

● XMLHttpRequest(XHR) 

서버와 통신을 하도록 하는 객체

1. 객체는 서버와 상호작용하기 위해 사용
2. 전체 페이지를 새로고침하지 않아도 URL을 통해 데이터를 전송하거나 받아 올수 있음
3. XML데이터 통신 x, 모든 종류의 데이터 받아올 수 있음
4. 객체는 브라우저에서 제공하는 API임  node.js환경x



 ajax(Asynchronous javascript and xml)

동적으로 서버에서 데이터를 주고받는 기술

 

 XML -  마크업 언어

 

 JSON(javascript object notation)

오브젝트를 보고 만든 데이터포멧
텍스트를 기반으로 하여 파일이 가벼움
데이터를 직렬화하여 전송할때 쓰이는 파일
프로그램 언어와 플랫폼에 상관 없이 사용가능함
모바일에서도 서버와 전송시 사용됨

 

1. JSON.stringify(obj)

자바스크립트 object를 문자형태로 직렬화


2. JSON.parse(json)

json타입을 자바스크립트 object형태로 변환JSON.parse() 메서드는 JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성합니다

 

JSON형태 

{
"name":"green",
"age": 30,
}

 




HTTP 통신은 기본적으로 요청(request)과 응답(response)으로 나눠짐

구조는 

요청라인
헤더
공백
바디


객체생성

const xhr = new XMLHttpRequest();


요청 전송(요청라인)

서버 요청 보내기 위해서 HTTP Method, 요청 URL을 정의


XMLHttpRequest의 내장함수 open()

구문)

xhr.open('GET', '/posts');
          (1)       (2)

 

▶매개변수(HTTP Method, URL 정의, 비동기 여부(기본값은 true임))
           

(1) .open()함수 첫번째 매개변수 HTTP Method 즉 HTTP요청방식

 

HTTP Method 설명
GET 리소스 요청 

일반적으로 정보를 받아옴 (웹다운로드) 읽는 친구

get방식 주소창보면 ?있음

ex) https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=computer

쿼리 시작지점은 ?부터 시작

사용자가 입력 받은 정보는 query

POST 리소스 생성 
 
새로운 자원 생성 (로그인 패스워드 담아서 넘겨줄때) 작성해주는 친구

post만 body에 담을수 있음
PUT 리소스 수정
PATCH 리소스 일부 수정
DELETE 리소스 삭제

 

!!! 클라이언트에서 서버로 HTTP 요청하기전에 맞는 헤더값 설정!!!!    

 

setRequestHeader()함수 (header) HTTP 관련 여러 설정값이 들어감

setRequestHeader()함수를 통해서 헤더값 설정 가능

요청할 때 서버로 전송하는 데이터의 타입을 선언하기 위한

용도로 많이 쓰임

헤더값 중 content-type에 해당

 


content-type은 서버로 전송할 데이터의 MINE 타입 정보를 설정 (크게 3가지로 나눠짐)

MINE 타입 content-type 값 목적
application application/json json데이터 전송
text text/plain 텍스트 데이터 전송
multipart multipart/from-data 파일 전송

구문)

xhr.setRequestHeader('content-type', 'application/json');


open() 함수와 setRequestHeader() 함수로 요청에 필요한 정의가 끝나면 send()함수를 통해 요청을 보냄
서버로 데이터 전송할게 있으면 send()매개 변수로 전달 → request의 body

HTTP 요청방법이 GET인 경우에는 send()함수 매개변수로 전달해도 실제로 전송 x

onload 이벤트 

문서의 모든 콘텐츠(images, script, css, etc)가 로드된 후 발생하는 이벤트

 


 

jsonplaceholder 가상 json서버 사용가능한 주소

https://jsonplaceholder.typicode.com/

 

JSONPlaceholder - Free Fake REST API

{JSON} Placeholder Free fake API for testing and prototyping. Powered by JSON Server + LowDB. Tested with XV. As of Oct 2022, serving ~1.7 billion requests each month.

jsonplaceholder.typicode.com


open url에 사용했음!!!!!!

 

HTTP

HTTP Method 가상서버에서 불러왔을 때 응답상태
GET 가상서버에서 전체 객체요소들을 다불러옴 성공응답상태 200
POST 가상서버에서 한개만 들고옴 101 성공응답상태 201
PUT url뒤에 수정할 객체 번호를 적어줘야함 
(post/1) 밑에 실습에 자세한 url
성공응답상태 200
DELETE put과 같이 뒤에 삭제할 번호 적어줘야함
(콘솔에 아무런 번호도 안나옴)
성공응답상태 200



HTTP 응답상태 코드  status code(200~ 500)  200번대 ok  

400번대 클라이언트 요청 잘못 했을때  500번대 서버에서 에러발생


200: "OK"
201:"ok" 요청이 성공적인 표현 post요청에 대한 응답결과
403: "허가금지"
404: "Not Found"

 

XHR readyState

0 (uninitialized) - (request가 초기화되지 않음)
1 (loading) - (서버와의 연결이 성사됨)
2 (loaded) - (서버가 request를 받음)
3 (interactive) - (request(요청)을 처리하는 중)
4 (complete) - (request에 대한 처리가 끝났으며 응답할 준비가 완료됨)

 

실습

HTTP Method: POST사용

const xhr = new XMLHttpRequest(); //XMLHttpRequest 객체 생성
        xhr.open("POST", "https://jsonplaceholder.typicode.com/posts"); //HTTP Method, URL 정의
        xhr.setRequestHeader("content-type", "application/json; charset=UTF-8"); //헤더값 중 content-type 정의

        xhr.send(JSON.stringify({title: "foo", body:"bar", userId:1}))  //요청 전송

        xhr.onload = () => {
            if(xhr.status === 201) {
                //201 상태코드는 요청이 성공적으로 처리 됬다는말/ 일반적으로 POST요청에 대한 응답
                const res = JSON.parse(xhr.response); // 응답데이터를 JSON.parse 함수의 JSON 객체로 변경
                console.log(res); //응답데이터 출력
            } else {
                //에러발생
                console.error(xhr.status, xhr.statusText); //응답상태와 응답 메시지 출력
            }
        }

 

출력(코드는 index.html에 작성 , 코드박스 하단 console확인)

 

 

HTTP Method: PUT사용

const xhr = new XMLHttpRequest(); //XMLHttpRequest 객체 생성
        xhr.open("PUT", "https://jsonplaceholder.typicode.com/posts/1");  //POST사용하면 id값 101나옴 / 지금처럼 사용하게되면 id값 1나옴
        //HTTP Method, url정의(가상서버 이용)
        xhr.setRequestHeader("content-type", "application/json; charset=UTF-8"); // 헤더값 중 content-type 정의
        xhr.send(JSON.stringify({title:"foo", body:"bar", userId:1})); //문자열로 요청 전송

        xhr.onload = () => {
            if(xhr.status === 200) {
                //PUT 요청이 정상적으로 완료되면 200
                const res = JSON.parse(xhr.response); //응답 데이터를 JSON.parse 함수의 JSON 객체로 변경
                console.log(res); //응답데이터 출력
            } else {
                //에러발생
                console.error(xhr.status, xhr.statusText); //응답상태와 응답메시지를 출력
            }
        }

 

출력(코드는 index.html에 작성 , 코드박스 하단 console확인)

 

HTTP Method: DELETE사용

const xhr = new XMLHttpRequest(); //XMLHttpRequest 객체 생성
        xhr.open("DELETE", "https://jsonplaceholder.typicode.com/posts/10"); //HTTP Method, URL정의
        xhr.setRequestHeader("content-type", "application/json; charset=UTF-8"); // 헤더 값 중 content-type 정의
        xhr.send(); //요청전송

        xhr.onload = () => {
            if(xhr.status === 200) {
                // DELETE 요청이 정상적으로 완료되면 200
                const res = JSON.parse(xhr.response); //응답 데이터를 JSON.parse 함수의 JSON 객체로 변경
                console.log(res);
            } else {
                //에러발생
                console.error(xhr.status, xhr.statusText); // 응답상태와 응답메시지를 출력
            }
        }

 

출력(코드는 index.html에 작성 , 코드박스 하단 console확인)

 

HTTP Method: GET사용

const xhr = new XMLHttpRequest(); //XMLHttpRequest 객체 생성
        xhr.open("GET", "https://jsonplaceholder.typicode.com/posts"); //HTTP Method, URL 정의
        //1번 요소만 가지고 오고싶으면 "https://jsonplaceholder.typicode.com/posts/1" id는 끝에 :id
        xhr.setRequestHeader("content-type", "applicaton/json"); //헤더값 중 content-type 정의
        xhr.send(); //요청 전송

        xhr.onload = () => {
            if (xhr.status === 200) {
                //정상적으로 응답되면 status가 200
                const res = JSON.parse(xhr.response); //응답 데이터를 JSON.parse 함수로 JSON 객체로 변경
                console.log(res); // 100개의 데이터를 받아옴
            } else {
                //에러 발생
                console.error(xhr.status, xhr.statusText); //응답상태와 응답메시지를 출력
            }
        }

 

출력(코드는 index.html에 작성 , 코드박스 하단 console확인)

 

짧게 구조 정리(끄적여봄...나의 미래야...)

더보기

const xhr = new XMLHttpRequest() 객체를 생성하구
xhr.open(get/post , url/posts) http 메서드와 url 정의
xhr.setRequestHeader("content-type", "application/json) 맞는값에 헤터값도 지정

.send() 함수에서 요청을 보내줌
.onload = () => 이벤트를 사용하여
if(xhr.status === 201(post 일때) 조건!!!!!  200 전송 성공한다면
JSON.parse(xhr.response) send에서 보내온 값을 response에서 응답하고

JSON.parse() 메서드에서 객체 생성
객체를 변수선언 된곳에 할당
console.log(JSON.parse(xhr.response))콘솔로 보내면 객체형태가 나옴


실패시 
console.error(xhr.status, xhr.statusText) 1번째 매개변수 있는건 응답상태(403, 404 등등), 2번째 매개변수는 1번째 매개변수 메세지("허가금지", "Not Found", 등등)

728x90
반응형

'javascript > javascript 고급문법' 카테고리의 다른 글

[javascript] Fetch API  (1) 2023.01.24
[javascript] try...catch(에러 핸들링)  (0) 2023.01.24
[javascript] this키워드  (0) 2023.01.23
[javascript] Modules  (0) 2023.01.11
[javascript]구조분해할당과 spread,rest  (0) 2023.01.05

댓글