RESTful API

What is RESTful API?

  • Representational

  • State

  • Transfer

  1. WWW (World Wide Web) 와 같은 Hypermedia system을 μœ„ν•œ Software Architecture 쀑 ν•˜λ‚˜μ˜ ν˜•μ‹

  2. REST ServerλŠ” clientκ°€ HTTP Protocol을 μ‚¬μš©ν•˜μ—¬ server의 정보에 μ ‘κ·Ό 및 변경을 κ°€λŠ₯μΌ€ 함

  3. μ •λ³΄λŠ” text, xml, json ν˜•μ‹μœΌλ‘œ 제곡됨

    • μš”μ¦˜μ€ json이 λŒ€μ„Έ!

HTTP method

REST 기반 architectureμ—μ„œ 자주 μ‚¬μš©λ˜λŠ” 4κ°€μ§€ methods

  1. GET

    : 쑰회

  2. PUT

    : 생성 및 μ—…λ°μ΄νŠΈ

  3. DELETE

    : 제거

  4. POST

    : 생성

Database 생성

  • JSON기반의 user database λ§Œλ“€κΈ°

Test04_RESTful > data > user.json

{
    "first_user": {
        "password": "first_pass",
        "name": "chloe"
    },
    "second_user":{
        "password": "second_pass",
        "name": "bella"
    }
}

1. API: GET/list

  • λͺ¨λ“  user list 좜λ ₯ν•˜λŠ” GET API λ§Œλ“€κΈ°

router > main.js

module.exports = function(app,fs){

    app.get('/', function(request, response) {
        response.render('index', {
            title: "MY HOMEPAGE",
            length: 5
        })
    });
    app.get('/list', function(request, response){
        fs.readFile(__dirname + "../data/" + "user.json", "utf8", function(error, data){

            console.log(data);
            response.end(data);
        })
    })
}
  • __dirname

    • ν˜„μž¬ module의 μœ„μΉ˜λ₯Ό λ‚˜νƒ€λƒ„

    • router module은 router folderμ•ˆμ— μžˆμ–΄μ„œ data folder에 μ ‘κ·Όν•˜λ €λ©΄ μƒλŒ€κ²½λ‘œ μ΄μš©ν•΄μ•Όν•¨!

server μ‹€ν–‰ ν›„ http://localhost/list 접속

image-20200407040640515

2. API: GET/getUser/:username

  • νŠΉμ • username의 detailν•œ 정보 κ°€μ Έμ˜€λŠ” GET API λ§Œλ“€κΈ°!

router > main.js 에 μΆ”κ°€

   app.get('/getUser/:username', function(req, res){
       fs.readFile( __dirname + "/../data/user.json", 'utf8', function (err, data) {
            var users = JSON.parse(data);
            res.json(users[req.params.username]);
       });
    });
  • file 읽은 ν›„, user idλ₯Ό μ°Ύμ•„μ„œ 좜λ ₯ν•΄μ€Œ

    • userλ₯Ό 찾으면 user data 좜λ ₯

    • μ—†μœΌλ©΄ {} 좜λ ₯

  • fs.readFile()둜 file을 μ½μ—ˆμ„ μ‹œμ—” text ν˜•νƒœλ‘œ 읽어지기 λ•Œλ¬Έμ— JSON.parse() λ₯Ό ν•΄μ•Όν•œλ‹€!

server λ‹€μ‹œ μ‹€ν–‰ ν›„ http://localhost/getUser/first_user 접속

image-20200407041513712

3. API: POST addUser/:username

body: { β€œpassword”: β€œβ€, β€œname”: β€œβ€ }

router > main.js 에 μΆ”κ°€

app.post('/addUser/:username', function(req, res){

        var result = {  };
        var username = req.params.username;

        // CHECK REQ VALIDITY
        if(!req.body["password"] || !req.body["name"]){
            result["success"] = 0;
            result["error"] = "invalid request";
            res.json(result);
            return;
        }

        // LOAD DATA & CHECK DUPLICATION
        fs.readFile( __dirname + "/../data/user.json", 'utf8',  function(err, data){
            var users = JSON.parse(data);
            if(users[username]){
                // DUPLICATION FOUND
                result["success"] = 0;
                result["error"] = "duplicate";
                res.json(result);
                return;
            }

            // ADD TO DATA
            users[username] = req.body;

            // SAVE DATA
            fs.writeFile(__dirname + "/../data/user.json",
                         JSON.stringify(users, null, '\t'), "utf8", function(err, data){
                result = {"success": 1};
                res.json(result);
            })
        })
    });
  • JSON ν˜•νƒœκ°€ Invalid ν•˜λ©΄ 였λ₯˜ λ°˜ν™˜

  • valid ν•˜λ©΄ νŒŒμΌμ„ μ—΄μ–΄μ„œ username의 쀑볡성을 확인 ν›„ JSON data에 μΆ”κ°€ν•˜μ—¬ λ‹€μ‹œ μ €μž₯

  • stringify(users, null, 2) 은 JSON 의 pretty-print λ₯Ό μœ„ν•¨

4. API: PUT updateUser/:username

body: { β€œpassword”: β€œβ€, β€œname”: β€œβ€ }

  • μ‚¬μš©μž 정보λ₯Ό updateν•˜λŠ” API

  • PUT method μ‚¬μš©

    • idempotent ν•œ PUT API

      • μš”μ²­μ„ λͺ‡ 번 μˆ˜ν–‰ν•˜λ”λΌλ„, 같은 κ²°κ³Όλ₯Ό 보μž₯해야함!

router > main.js 에 μΆ”κ°€

app.put('/updateUser/:username', function(req, res){

        var result = {  };
        var username = req.params.username;

        // CHECK REQ VALIDITY
        if(!req.body["password"] || !req.body["name"]){
            result["success"] = 0;
            result["error"] = "invalid request";
            res.json(result);
            return;
        }

        // LOAD DATA
        fs.readFile( __dirname + "/../data/user.json", 'utf8',  function(err, data){
            var users = JSON.parse(data);
            // ADD/MODIFY DATA
            users[username] = req.body;

            // SAVE DATA
            fs.writeFile(__dirname + "/../data/user.json",
                         JSON.stringify(users, null, '\t'), "utf8", function(err, data){
                result = {"success": 1};
                res.json(result);
            })
        })
    });

5. API: DELETE deleteUser/:username

  • μ‚¬μš©μž dataλ₯Ό μ‚­μ œν•˜λŠ” API

    • DELETE method μ‚¬μš©

router > main.js에 μΆ”κ°€

app.delete('/deleteUser/:username', function(req, res){
        var result = { };
        //LOAD DATA
        fs.readFile(__dirname + "/../data/user.json", "utf8", function(err, data){
            var users = JSON.parse(data);

            // IF NOT FOUND
            if(!users[req.params.username]){
                result["success"] = 0;
                result["error"] = "not found";
                res.json(result);
                return;
            }

            // DELETE FROM DATA
            delete users[req.params.username];

            // SAVE FILE
            fs.writeFile(__dirname + "/../data/user.json",
                         JSON.stringify(users, null, '\t'), "utf8", function(err, data){
                result["success"] = 1;
                res.json(result);
                return;
            })
        })

    });

Last updated

Was this helpful?