What is RESTful API?
WWW (World Wide Web) 와 같은 Hypermedia system
을 위한 Software Architecture
중 하나의 형식
REST Server
는 client가 HTTP Protocol을 사용하여 server의 정보에 접근 및 변경을 가능케 함
정보는 text
, xml
, json
형식으로 제공됨
HTTP method
REST 기반 architecture에서 자주 사용되는 4가지 methods
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
router module은 router folder안에 있어서 data folder에 접근하려면 상대경로 이용해야함!
server 실행 후 http://localhost/list 접속
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를 찾아서 출력해줌
fs.readFile()
로 file을 읽었을 시엔 text 형태로 읽어지기 때문에 JSON.parse()
를 해야한다!
server 다시 실행 후 http://localhost/getUser/first_user 접속
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”: “” }
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
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;
})
})
});