π©π» λ°±μλ(Back-End)/Node js
[http λͺ¨λλ‘ μλ²] (2) RESTλ‘ RESTful ν μΉ μλ² λ§λ€κΈ°
μ§μ§μνμΉ΄
2023. 4. 16. 01:59
728x90
λ°μν
<λ³Έ λΈλ‘κ·Έλ Node.js κ΅κ³Όμλ₯Ό μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€ :-)>
π REST (REpresentational State Transfer)
: μλ²μ μμμ μ μνκ³ μμμ λν μ£Όμλ₯Ό μ§μ νλ λ°©λ²
π RESTful
: RESTλ₯Ό λ°λ₯΄λ μλ²
π HTTP μμ² λ©μλ
GET : μλ² μμμ κ°μ Έμ€κ³ μ ν λ μ¬μ©
POST : μλ²μ μμμ μλ‘ λ±λ‘ν λ μ¬μ©
PUT : μλ²μ μμμ μμ²μ λ€μ΄ μλ μμμΌλ‘ μΉνν λ μ¬μ©
PATCH : μλ² μμμ μΌλΆλ§ μμ ν λ μ¬μ©
DELETE : μλ²μ μμμ μμ ν λ μ¬μ©
OPTIONS : μμ²μ νκΈ° μ μ ν΅μ μ΅μ μ€λͺ νκΈ° μν΄ μ¬μ©
π RESTλ‘ RESTful ν μΉ μλ² λ§λ€κΈ°
πΏ about.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">
<title>RESTful SERVER</title>
</head>
<body>
<nav>
<a href="/">Home</a>
<a href="/about">About</a>
</nav>
<div>
<h2>μκ° νμ΄μ§</h2>
<p>μ¬μ©μ μ΄λ¦μ λ±λ‘νμΈμ!</p>
</div>
</body>
</html>
πΏ restFront.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">
<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="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="./restFront.js"></script>
</body>
</html>
πΏ restFront.js
// λ‘λ© μ μ¬μ©μ μ 보 κ°μ Έμ€κΈ°
async function getUser() {
try {
const res = await axios.get("/users");
const users = res.data;
const list = document.getElementById("list");
list.innerHTML = "";
// μ¬μ©μλ§μ λ°λ³΅μ μΌλ‘ νλ©΄ νμ λ° μ΄λ²€νΈ μ°κ²°
Object.keys(users).map(function (key) {
const userDiv = document.createElement("div");
const span = document.createElement("span");
span.textContent = users[key];
const edit = document.createElement("button");
edit.textContent = "μμ ";
edit.addEventListener("click", async () => {
const name = prompt("λ°κΏ μ΄λ¦μ μ
λ ₯νμΈμ");
if (!name) {
return alert("μ΄λ¦μ λ°λμ μ
λ ₯!");
}
try {
await axios.put("/user/" + key, { name });
getUser();
} catch (err) {
console.error(err);
}
});
const remove = document.createElement("button");
remove.textContent = "μμ ";
remove.addEventListener("click", async () => {
try {
await axios.delete("/user/" + key)
getUser();
} catch (err) {
console.error(err);
}
});
userDiv.appendChild(span);
userDiv.appendChild(edit);
userDiv.appendChild(remove);
list.appendChild(userDiv);
console.log(res.data);
});
} catch (err) {
console.error(err);
}
}
// νλ©΄ λ‘λ© μ getUser νΈμΆ
window.onload = getUser;
// νΌ μ μΆ μ μ€ν
document.getElementById("form").addEventListener("submit", async (e) => {
e.preventDefault();
const name = e.target.username.value;
if (!name) {
return alert("μ΄λ¦μ λ°λμ μ
λ ₯!");
}
try {
await axios.post("/user", { name });
getUser();
} catch (err) {
console.log(err);
}
e.target.username.value = "";
});
πΏ restFront.css
a {color:blue; text-decoration: none;}
πΏ restServer.js
const http = require("http");
const fs = require("fs").promises;
const users = {};
http.createServer(async (req, res) => {
try {
console.log(req.method, req.url);
if (req.method == "GET") {
if (req.url === "/") {
const data = await fs.readFile("./restFront.html");
res.writeHead(200, { "Content-type": "text/html : charset=utf-8" });
return res.end(data);
} else if (req.url === "/about") {
const data = await fs.readFile("./about.html");
res.writeHead(200, { "Content-type": "text/html : charset=utf-8" });
return res.end(data);
} else if (req.url === "/users") {
res.writeHead(200, { "Content-type": "text/plain : charset=utf-8" });
return res.end(JSON.stringify(users));
}
try {
const data = await fs.readFile(`.${req.url}`);
return res.end(data);
} catch (err) {
// 404 not found
}
} else if (req.method === "POST") {
if (req.url === "/user") {
let body = "";
// μμ²μ bodyλ₯Ό stream ννλ‘ λ°μ
req.on("data", (data) => {
body += data;
});
return req.on("end", () => {
console.log("POST λ³Έλ¬Έ(body) : ", body);
const { name } = JSON.parse(body);
const id = Date.now();
users[id] = name;
res.writeHead(201);
res.end("λ±λ‘ μ±κ³΅");
});
}
} else if (req.method === "PUT") {
if (req.url.startsWith("/user/")) {
const key = req.url.split("/")[2];
let body = "";
// μμ²μ bodyλ₯Ό stream ννλ‘ λ°μ
req.on("data", (data) => {
body += data;
});
console.log("hi")
return req.on("end", () => {
console.log("PUT λ³Έλ¬Έ(body) : ", body);
users[key] = JSON.parse(body).name;
return res.end(JSON.stringify(users));
});
}
} else if (req.method === "DELETE") {
if (req.url.startsWith("/user/")) {
const key = req.url.split("/")[2];
delete users[key];
return res.end(JSON.stringify(users));
}
}
res.writeHead(404);
return res.end("NOT FOUND");
} catch (err) {
console.error(err);
res.writeHead(500);
res.end(err);
}
})
.listen(8082, () => {
console.log("8082λ² ν¬νΈμμ μλ² λκΈ°μ€");
});
728x90
λ°μν