스토리지

[06.04] Node.js - REST API 본문

Node.js

[06.04] Node.js - REST API

ljw4104 2021. 6. 4. 12:45

네트워크 구조의 한 형식

  • REpresentational State Transfer의 약자 : 서버의 자원을 정의하고, 자원에 대한 주소를 지정하는 방법을 가리킨다. 
  • 주소는 의미를 명확히 전달하기 위해 명사로 구성됨.

HTTP 요청 메서드

  • GET : 서버 자원을 가져오고자 할 때 사용함. 요청의 본문에 데이터를 넣지 않음. 서버로 데이터를 보낼 때, 쿼리스트링을 사용함 (ex. index.html?name=홍길동&age=25)
  • POST : 서버에 자원을 새로 등록하고자 할 때, 사용한다. 요청의 본문(Body)에 새로 등록할 데이터를 넣어 보낸다.
  • PUT : 서버의 자원을 요청에 들어있는 자원으로 치환하고자 할 때 사용.
  • PATCH : 서버 자원의 일부만 수정
  • DELETE : 서버 자원을 삭제

주소 하나가 요청 메서드를 여러개를 가질 수 있다.

 

AJAX를 사용한 예제

더보기

resFront.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./resFront.css" />
    <title>RESTful SERVER</title>
</head>

<body>
    <nav>
        <a href="/">Home</a>
        <a href="/about">About</a>
    </nav>
    <div>
        <form id="form">
            <input type="text" id="username" />
            <button type="submit">등록</button>
        </form>
    </div>
    <div id="list"></div>
    <script src="./resFront.js"></script>
</body>

</html>

 

resFront.css

a {
    color:blue;
    text-decoration: none;
}

 

resFront.js

function getUser() {
    //로딩 시 사용자가 가져오는 함수
    let xhr = new XMLHttpRequest();
    xhr.onload = function () {
        //응답 받았을때
        if (xhr.status == 200) {
            //역직렬화함.
            let users = JSON.parse(xhr.responseText);
            //list라는 이름의 HTML요소를 가져옴
            let list = document.getElementById('list');
            list.innerHTML = '';
            Object.keys(users).map(function(key){
                let userDiv = document.createElement('div');
                let span = document.createElement('span');
                span.textContent = users[key];
                userDiv.appendChild(span);
                list.appendChild(userDiv);
            });
        }
    };
    xhr.open('GET', '/users');
    xhr.send();
}

//로딩 시 getUser 호출
window.onload = getUser;

document.getElementById('form').addEventListener('submit', function (e) {
    //이벤트 전파를 막음
    e.preventDefault();
    //Input Text의 값을 가져온다
    let name = e.target.username.value;
    //값이 비어있으면 alert창을 띄우고 함수를 종료한다.
    if (!name) {
        return alert("이름을 입력하세요.");
    }
    //값이 있으면 출력
    console.log(name);

    //AJAX - 새로고침이 없어도 URL로부터 데이터를 받아올 수 있다.
    let xhr = new XMLHttpRequest();
    //응답 받으면 호출되는 CALLBACK
    xhr.onload = function () {
        if (xhr.status == 201) {
            //등록이 완료되었다면
            getUser();
        }
        else {
            console.error(xhr.responseText);
        }
    };
    //어디에
    xhr.open('POST', '/users');
    //어떤 형식으로
    xhr.setRequestHeader('Content-Type', 'application/json');
    //서버에 데이터를 JSON형식으로 보낸다.
    xhr.send(JSON.stringify({ name }));

    //Input TextBox를 초기화
    e.target.username.value = '';
});

서버부분

 

restServer.js

const http = require('http');
const fs = require('fs');
const users = {};

//서버 생성 + 요청콜백 등록
const server = http.createServer((req, res) => {
    //GET방식으로 요청 받았을 때
    if (req.method === 'GET') {
        //URL이 / 라면
        if (req.url === '/') {
            //restfront.html파일을 읽고 응답한다.
            return fs.readFile('./resFront.html', (err, data) => {
                //파일을 읽다가 문제가 생기면 err매개변수에 값이 들어옴.
                if (err) throw err;
                //정상적으로 읽었다면 data에 값이 들어옴 (buffer)
                //응답 후 종료
                res.end(data);
            });
        }
        else if (req.url === '/users') {
            return res.end(JSON.stringify(users));
        }

        return fs.readFile(`.${req.url}`, (err, data) => {
            if (err) throw err;
            return res.end(data);
        });
    }
    else if (req.method === 'POST') {
        if (req.url === '/users') {
            let body = "";
            req.on('data', (data) => {
                body += data;
            });
            //요청을 끝냄
            return req.on('end', () => {
                //응답을 끝냄
                const { name } = JSON.parse(body);
                const id = +new Date();
                users[id] = name;
                console.log(users);
                res.writeHead(201);
                res.end('등록 성공');
            });
        }
    }
    res.writeHead(404, 'NOT FOUND');
    return res.end('NOT FOUND');
});

//서버시작
server.listen(8085, () => {
    console.log("8085번 포트에서 서버 대기중");
});

Form에서 입력한 값이 Server에서 Buffer에서 출력이 된다.

Comments