RESTful API
- REST 란?
- Representational State Transfer 의 약자
- api 에 대한 상세 스펙을 보지 않아도 HTTP요청의 여러 정보를 통해 API가 하는 일을 알 수 있도록 설계된 api
- REST API가 표현하는 것
- 자원과 자원에 대한 행위
- 자원 : 서버에 저장되어 있는 데이터들
- 쇼핑몰 서비스에서의 자원 : 상품 목록,주문 목록,회원 목록 등
- 도서관리 서비스에서의 자원 : 도서 자체
- REST API를 통해 사용하려는 자원을 HTTP uri 로 명시
- HTTP메서드로 자원에 대한 행위를 명시
CRUD
- Create : 생성(POST)
- Read : 조회(GET)
- Update : 수정(PUT)
- Delete : 삭제(DELETE)
REST API 작성 규칙
- 자원은 URI에 영문 소문자, 명사 복수형으로 표현
- 파일 확장자는 URI에 포함하지 않음
- 자원의 계층구조는 /(슬래쉬)로 표현
RESTAPI 예시
CRUD | HTTP 메서드 | URI |
책들의 목록을 표시 | GET | /books |
책 한권의 정보를 표시 | GET | /books/{id} |
새 책을 생성 | POST | /books |
책을 수정 | PUT | /books/{id} |
책을 삭제 | DELETE | /books/{id} |
RESTful API를 사용하는 이유
- HTTP프로토콜 상에서 동작
- 특정 언어나 플랫폼에 종속되지 않음
- API 의 의도를 API사용자가 쉽게 파악할 수 있음
Express.js로 RESTful API 만들기
- Express로 HTTP 메서드 처리
- Express로 URI 처리
- Express로 HTTP 바디 처리
Express Router
- 미들웨어의 한 종류
- HTTP 메서드, uri 에 따라 미들웨어 실행 여부 결정
- Router 생성
- express.Router()로 Express Router 생성
- 생성한 라우터는 다른 미들웨어와 마찬가지로 app.use 를 통해 등록할 수 있음
- Express Router를 사용하면 Express앱의 모듈화가 가능
# router.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
res.send('GET /');
});
router.post('/', function(req, res, next) {
res.send('POST /');
});
router.put('/', function(req, res, next) {
res.send('PUT /');
});
router.delete('/', function(req, res, next) {
res.send('DELETE /');
});
module.exports = router;
# index.js
var express = require('express');
var app = express();
var router = require('./router.js')
app.use(router);
app.listen(3000, function() {
console.log("3000 포트로 웹서버 실행!");
});
- Insomnia 설치
- 서버에 GET, POST, PUT, DELETE 등을 전달할 수 있는 유틸리티
Express Route Parameter
- RESTApi 에서 자원의 아이디를 uri 를 통해 전달
- 아이디와 같이 Uri의 변하는 요소를 Route prameter 라고 함
- Express Router 에서는 :(콜론)과 파라미터 이름으로 Route parameter를 설정
- Request 객체의 params 프로퍼티로 Route parameter에 접근
router.get('/:id', function(req, res, next) {
res.send('전달받은 파라미터 : ' + req.params.id);
});
- GET localhost:3000 -> 응답 : Cannot GET/
- GET localhost:3000/13244 -> 응답 : 전달받은 파라미터 : 13244
Query String
- URI 를 통해 값을 전달하는 또 하나의 방법
- RESTAPI 에서는 주로 자원을 검색, 필터링 할 때 사용
- ex) /books?author=김군오&language=kr
Express에서 Query String 사용
- Request 객체의 query 프로퍼티로 접근
- Route parameter 와 다르게 어떤 query string을 받을지 미리 설정하지 않음
- 라우트에 영향을 주지 않음
- 쿼리스트링의 유무와 관계없이 http 메서드와 uri 를 통해서만 라우트가 결정
- 전달하지 않은 query string에 접근하면 값이 설정되어 있지 않음
- undefined 변수로 취급
router.delete('/', function(req, res, next) {
res.send('Year : ' + req.query.year);
});
- DELETE localhost:3000 -> 응답 : Year : undefined
- DELETE localhost:3000/?year=2021 -> 응답 : Year : 2021
HTTP Body
• POST, PUT 메서드는 HTTP 요청에 Body 전달 가능
• Body에는 text, json, xml, html, 파일 등 어느 것이라도 전송될 수 있음
• Body는 Content-type 헤더에 따라 적절히 해석되어야 함
# index.js
app.use(express.json());
# router.js
router.post('/', function(req, res, next) {
res.send('제목 : ' + req.body.title);
});
# insomnia test json
{
"title" : "도서의 제목입니다."
}
- POST localhost:3000 -> 응답 : 도서의 제목입니다.