[모던 자바스크립트 Deep Dive] 44. REST API
44. REST API
REST는 HTTP를 기반으로 클라이언트가 서버에 리소스에 접근하는 방식을 규정한 아키텍처고, REST API는 REST를 기반으로 서비스 API를 구현한 것을 의미한다.
44.1 REST API의 구성
- REST API는 자원 ,행위,표현의 3가지 요소로 구성된다. REST는 자체 표현 구조로 구성되어 REST API만으로 HTPTP 요청의 내용을 이해할 수 있다.
44.2 REST API 설계 원칙
- 기본적 원칙 2가지
- URI는 리소스를 표현하는 데 집중하고 행위에 대한 정의는 HTTP 요청 메서드를 통해 하는 것이 RESTful API 설계하는 중심 규칙이다.
1. URI는 리소스를 표현해야 한다
- URI 리소스를 표현하는데 중점을 두어야 한다. 리소스를 식별할 수 있는 이름은 동사보다는 명사를 이용, get 같은 행위에 대한 표현이 들어가서는 안된다.
더보기
#bed
GET /getTodos/1
GET /todos/show/1
#good
GET / todos/1
2. 리소스에 대한 행위는 HTTP 요청 메서드로 표현한다.
- HTTP 요청 메서드는 클라이언트가 서버에게 요청의 종류와 목적(리소스에 대한 행위)을 알리는 방법이다.
- 주로 5가지 요청 메서드를 사용하여 CRUE를 구현
- 리소스에 대한 행위는 HTTP 요청 메서드를 통해 표현하며 URI에 표현하지 않는다.
더보기
#bed
GET /todos/delete/1
#good
DELETE / todos/1
44.3 JSON Server를 이용한 REST API 실습
- JSON Server를 사용해 가상 REST API 서버를 구축하여 HTTP 요청을 전송하고 응답을 받는 실습
1. JSON Server 설치
$ mkdir rest-api-exam && cd rest-api-exam
$ npm init -y
$ npm install json-server
2. db.json 파일 생성
{
"todos": [
{ "id": 1, "content": "HTML", "completed": false },
{ "id": 2, "content": "CSS", "completed": true },
{ "id": 3, "content": "Javascript", "completed": false }
]
}
3. JSON Server 실행
{
"name": "rest-api-exam",
"version": "1.0.0",
"description": "",
"scripts": {
"start": "json-server --watch db.json --port 5000"
},
"dependencies": {
"json-server": "^0.15.0"
}
}
$ npm start
4. GET 요청
const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:5000/todos');
xhr.send();
xhr.onreadystatechange = function (e) {
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if(xhr.status === 200) { // 200: OK => https://httpstatuses.com
console.log(xhr.responseText);
} else {
console.log("Error!");
}
};
$ curl -X GET http://localhost:5000/todos/1
{
"id": 1,
"content": "HTML",
"completed": false
}
const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:5000/todos/1');
xhr.send();
xhr.onreadystatechange = function (e) {
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if(xhr.status === 200) {
console.log(xhr.responseText);
} else {
console.log("Error!");
}
};
5. POST 요청
$ curl -X POST http://localhost:5000/todos -H "Content-Type: application/json" -d '{"id": 4, "content": "Angular", "completed": true}'
{
"id": 4,
"content": "Angular",
"completed": true
}
const xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:5000/todos');
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(JSON.stringify({ id: 4, content: 'Angular', completed: true }));
xhr.onreadystatechange = function (e) {
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if(xhr.status === 201) { // 201: Created
console.log(xhr.responseText);
} else {
console.log("Error!");
}
};
6. PUT 요청
$ curl -X PUT http://localhost:5000/todos/4 -H "Content-Type: application/json" -d '{"id": 4, "content": "React", "completed": false}'
{
"content": "React",
"completed": false,
"id": 4
}
const xhr = new XMLHttpRequest();
xhr.open('PUT', 'http://localhost:5000/todos/4');
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(JSON.stringify({ id: 4, content: 'React', completed: false }));
xhr.onreadystatechange = function (e) {
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if(xhr.status === 200) {
console.log(xhr.responseText);
} else {
console.log("Error!");
}
};
7. PATCH 요청
$ curl -X PATCH http://localhost:5000/todos/4 -H "Content-Type: application/json" -d '{"completed": true}'
{
"id": 4,
"content": "React",
"completed": true
}
const xhr = new XMLHttpRequest();
xhr.open('PATCH', 'http://localhost:5000/todos/4');
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(JSON.stringify({ completed: true }));
xhr.onreadystatechange = function (e) {
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if(xhr.status === 200) {
console.log(xhr.responseText);
} else {
console.log("Error!");
}
};
8. DELETE 요청
$ curl -X DELETE http://localhost:5000/todos/4
{}
const xhr = new XMLHttpRequest();
xhr.open('DELETE', 'http://localhost:5000/todos/4');
xhr.send();
xhr.onreadystatechange = function (e) {
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if(xhr.status === 200) {
console.log(xhr.responseText);
} else {
console.log("Error!");
}
};
블로그의 정보
개발 블로그👩💻
Blairj