Hello, Android!
RESTful서버 본문
이번에는 Node에서 REST를 사용한 주소 체계로 RESTful한 서버를 만들어 보았다
간단하게 서버에 파일을 저장, 검색, 삭제 기능을 수행하도록 하였다
각 함수별로 서버에서 수행 가능한 기능을 정리하면
GET : / 를 기준으로 첫번째로 있는 파일을 제공, 파일이 존재하지 않으면 404, 읽기 실패는 500
ex) /ryan 의 경우 ryan파일을 제공
POST : / 를 기준으로 첫번째로 있는 이름으로 body를 파일 저장, 서버에서 쓰기 실패는 500
ex) /ryan 의 경우 body를 ryan으로 저장
DELETE : / 를 기준으로 첫번째로 있는 이름의 파일을 삭제, 파일이 없는 경우 404, 삭제 실패는 500
ex) /ryan 의 경우 ryan파일을 찾아 삭제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
const http = require("http")
const fs = require("fs").promises
const nfs = require("fs")
http.createServer(async (req, res) => {
try{
console.log(req.method, req.url)
if(req.method === "GET"){
if(req.url === "/friends"){
const data = await fs.readFile(`./friends.json`)
res.writeHead(200, {"Content-Type": "application/json; charset=utf-8"})
return res.end(data)
}else{
const fn = req.url.split("/")[1]
if(nfs.existsSync(`./${fn}`)){
try{
const data = await fs.readFile(`./${fn}`)
res.writeHead(200, {"Content-Type": "application/json; charset=utf-8"})
return res.end(data)
}catch(err){
console.error(err)
res.writeHead(500)
return res.end("file read error")
}
}
}
res.writeHead(404)
return res.end("file not found")
} else if(req.method === "POST"){
const fn = req.url.split("/")[1]
let body
req.on("data", (data) => {
body = data
})
return req.on("end", async () => {
try{
await fs.writeFile(`./${fn}`, body)
res.end("write success")
}catch(err){
console.error(err)
res.writeHead(500)
res.end("file write fail")
}
})
} else if(req.method === "DELETE"){
const fn = req.url.split("/")[1]
if(nfs.existsSync(`./${fn}`)){
try{
await fs.unlink(`./${fn}`)
return res.end("delete success")
}catch(err){
console.error(err)
res.writeHead(500)
return res.end("file delete fail")
}
}
res.writeHead(404)
return res.end("file not found")
}
}catch(err){
console.error(err)
res.writeHead(500)
res.end(err.message)
}
})
.listen(8080, () =>{
console.log("port 8080")
})
|
cs |
위의 예제에서 우선 제일 먼저 req.method로 HTTP 메서드를 구분하고 있다
- GET
GET인 경우에는 req.url을 사용하여 다시 주소를 구분한다
주소가 /friends 인 경우에는 미리 준비된 friends.json 파일을 제공하고
그 이외의 경우에는 / 뒤의 파일명을 찾아 제공한다
예를들어 /ryan.json 이라면 서버에서 ryan.json을 찾아 제공한다
- POST
POST에서 요청 데이터를 받을때는 req.on("data")를 사용하여 받고
이후에는 return req.on("end") 에서 파일을 쓰고 응답을 한 뒤 종료한다
req도 내부적으로는 스트림으로 되어 있기때문에
요청과 응답의 데이터가 스트림 형식으로 전달된다
그렇기 때문에 req.on("data") 에서 요청의 body를 다 읽을때 까지 기다린 뒤
end 이벤트가 발생했을때 파일에 쓰기 작업을 진행하게 된다