0608 REST API와 라우팅

2021. 6. 4. 12:51Node.js


서버에 요청을 보낼 때 주소를 통해 요청의 내용을 보낸다.
네트워크 구조의 한 형식, 서버의 자원을 정의하고, 자원에 대한 주소를 지정하는 방법을 가리킨다.
주소는 명사로 구성된다.

  • GET: 서버 자원을 가져올 때. 데이터를 서버로 보낼 땐 쿼리 스트링을 이용한다.요청의 본문은 데이터에 넣지 않는다. 
  • POST: 서버에 자원을 새로 등록할 때. 본문에 데이터를 담아서 보낸다.
  • PUT: 서버의 자원을 치환할 때.
  • PATCH: 서버의 자원을 업데이트할 때.
  • DELETE: 서버의 자원을 삭제할 때.
    • 주소 하나가 요청 메서드를 여러 개 가질 수 있다. 
<!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">
    <title>RESTful Server</title>
    <link ref="stylesheet" href="./restFont.css"/>
</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="./restFront.js"></script>
</body>
</html>
function getUser(){
    //로딩 시 사용자가 가져오는 함수
    console.log("getUser");
};
//로딩 시 getUser 호출
window.onload = getUser;

document.getElementById('form').addEventListener('submit',function(e){
    e.preventDefault();
    console.log('submit');
});

html form 태그에 담긴 등록 버튼을 누르면 submit이 출력되도록 했다.

 

function getUser(){
    //로딩 시 사용자가 가져오는 함수
    console.log("getUser");
};
//로딩 시 getUser 호출
window.onload = getUser;

document.getElementById('form').addEventListener('submit',function(e){
    console.log('submit');
    //이벤트 전파를 막는다.
    e.preventDefault();
    //input의 값을 가져온다.
    let name = e.target.username.value;
    if(!name){
        //input의 값이 없을 때 경고창을 띄운다.
        return alert("이름을 입력하세요.");
    }
    console.log(name);

    //AJAX
    let xhr = new XMLHttpRequest();
    xhr.onload = function(){
        console.log('xhr.status: '+xhr.status);
    };
    //어디로
    xhr.open('POST','/users');
    //json 형식으로
    xhr.setRequestHeader('Content-Type','application/json');
    //서버에 데이터를 보낸다.
    xhr.send(JSON.stringify({name:name}));
    //인풋 텍스트를 비운다.
    e.target.username.value="";
});

AJAX 기술
새로고침이 없어도 페이지의 일부를 가져올 수 있다.
XMLHttpRequest는 AJAX의 리퀘스트로 사용한다.

input 값이 없는데도 등록을 누를 경우엔 경고창을 띄운다.

 

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('./restFront.html',(err,data)=>{
                //파일을 읽다가 문제가 생기면 err 매개변수에 값이 들어옴
                if(err) throw err; //응답 후 종료
                
                //정상적으로 읽었다면 data에 값이 들어온다.(buffer)
                res.end(data); //응답 후 종료
            })
        }

        //js 파일과 css파일을 로드 함
        return fs.readFile(`.${req.url}`,(err,data)=>{
            if(err){
                res.writeHead(404,'NOT FOUND');
                return res.end("Not Found");
            }
            return res.end(data);
        })
    }

    else if(req.method==='POST'){
        if(req.url==='/users'){
            req.on('data',data=>{
                console.log(data);
            });
            //요청을 끝냄
            return req.on('end',()=>{
                res.writeHead(201);
                console.log('end');
                //응답 종료
                res.end('등록 성공');
            });
        }
    }
    res.writeHead(404,'Not Found');
    return res.end('Not Found');
});

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

서버를 오픈했다. GET 방식/POST 방식/에러가 날 시 404를 띄우게 했다.

 

 

//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('./restFront.html',(err,data)=>{
                //파일을 읽다가 문제가 생기면 err 매개변수에 값이 들어옴
                if(err) throw err; //응답 후 종료
                
                //정상적으로 읽었다면 data에 값이 들어온다.(buffer)
                res.end(data); //응답 후 종료
            })
        }
        else if(req.url==='/users'){
            return res.end(JSON.stringify(users));
        }

        //js 파일과 css파일을 로드 함
        return fs.readFile(`.${req.url}`,(err,data)=>{
            if(err){
                res.writeHead(404,'NOT FOUND');
                return res.end("Not Found");
            }
            return res.end(data);
        })
    }

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

//서버 시작
server.listen(8080,()=>{
    console.log('8080포트에서 서버 대기 중');
})
//restFront.js

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

 

//restFront.js


function getUser(){
    //로딩 시 사용자가 가져오는 함수
    console.log("getUser");
    let xhr = new XMLHttpRequest();
    xhr.onload = function(){
        //응답받았을때
        if(xhr.status===200){
            alert(xhr.responseText);
            //역직렬화
            let users = JSON.parse(xhr.responseText);
            //list이름으로 html 요소를 가져온다
            let list = document.getElementById('list');
            console.log(list);
            list.innerHTML='';
            Object.keys(users).map(function(key){
                let userDiv = document.createElement('div');
                let span =  document.createElement('span');
                let remove = document.createElement('button');
                let button2 = document.createElement('button');
                span.textContent = users[key];
                
                remove.textContent = '삭제';
                remove.addEventListener('click',()=>{
                    //삭제 버튼이 클릭 되었다면 실행되는 콜백 함수
                    alert(users[key]+"님을 삭제합니다.");
                    let xhr = new XMLHttpRequest(); //AJAX에 필요한 API
                    xhr.onload = ()=>{
                        if(xhr.status==200){
                            getUser();
                        }
                        else{
                            console.error(xhr.responseText);
                        }
                    };//응답을 받으면 처리하는 함수
                    xhr.open('DELETE','/users/'+key); //localhost:8080/users/key
                    xhr.send();
                });
                userDiv.appendChild(remove);

                button2.textContent = '수정';
                userDiv.appendChild(span);
                
                list.appendChild(userDiv);
            });
        }
    };
    xhr.open('GET','/users');
    xhr.send();
};
//로딩 시 getUser 호출
window.onload = getUser;

document.getElementById('form').addEventListener('submit',function(e){
    console.log('submit');
    //이벤트 전파를 막는다.
    e.preventDefault();
    //input의 값을 가져온다.
    let name = e.target.username.value;
    if(!name){
        //input의 값이 없을 때 경고창을 띄운다.
        return alert("이름을 입력하세요.");
    }
    console.log(name);

    //AJAX
    let xhr = new XMLHttpRequest();
    xhr.onload = function(){
        console.log('xhr.status: '+xhr.status);
        //등록이 완료 되었다면
        if(xhr.status===201){
            getUser();
        }
        else{
            console.log(xhr.responseText);
        }
    };
    //어디로
    xhr.open('POST','/users');
    //json 형식으로
    xhr.setRequestHeader('Content-Type','application/json');
    //서버에 데이터를 보낸다.
    xhr.send(JSON.stringify({name:name}));
    //인풋 텍스트를 비운다.
    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('./restFront.html',(err,data)=>{
                //파일을 읽다가 문제가 생기면 err 매개변수에 값이 들어옴
                if(err) throw err; //응답 후 종료
                
                //정상적으로 읽었다면 data에 값이 들어온다.(buffer)
                res.end(data); //응답 후 종료
            })
        }
        else if(req.url==='/users'){
            return res.end(JSON.stringify(users));
        }

        //js 파일과 css파일을 로드 함
        return fs.readFile(`.${req.url}`,(err,data)=>{
            if(err){
                res.writeHead(404,'NOT FOUND');
                return res.end("Not Found");
            }
            return res.end(data);
        })
    }

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

    else if(req.method==='DELETE'){
        if(req.url.startsWith('/users')){
            const key = req.url.split('/')[2]; //키를 가져옴
            delete users[key]; //객체의 속성을 삭제
            return res.end(JSON.stringify(users));
        }
    }
    res.writeHead(404,'Not Found');
    return res.end('Not Found');
});

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

등록한 이름이 아래에 리스트로 뜨고,
삭제를 누르면
리스트에서 등록한 이름이 사라지도록 했다.

'Node.js' 카테고리의 다른 글

0609 express 서버 열기  (0) 2021.06.09
0608 npm express 웹 서버 만들기  (0) 2021.06.08
0603 http 모듈로 서버 만들기  (0) 2021.06.03
0602 js2(array, promise,module,timeout/interval,예외처리)  (0) 2021.06.02
0601 Node.js  (0) 2021.06.01