• Representational State Transfer의 약자
• api 에 대한 상세 스펙을 보지 않아도 HTTP요청의 여러 정보를 통해 API가 하는 일을 알 수 있도록 설계된 api
RESTAPI가 표현하는 것
• 자원과 자원에 대한 행위
• 자원 :서버에 저장되어 있는 데이터들
쇼핑몰 서비스에서의 자원 :상품 목록,주문 목록,회원 목록 등
도서관리 서비스에서의 자원 : 도서 자체
RESTAPI를 통해 사용하려는 자원을 HTTP uri 로 명시
HTTP메서드로 자원에 대한 행위를 명시
CRUD : Http 메서드 - URI
책들의 목록을 표시 : GET - /books
책 한권의 정보를 표시 : GET - /books/{id} - 자원 하나만을 가져 올때, id를 사용
새 책을 생성 : POST - /books
책을 수정 : PUT - /books/{id}
책을 삭제 : DELETE - /books/{id}
: Router의 get, post, put, delete 함수를 사용하여 각각 HTTP의 해당 메서드로 요청이 왔을 때 처리할 미들웨어를 등록
ronter.js 코드
var express = require('express');
var router = express.Router();
// 첫번째 인자로는 요청을 처리할 uri 를 전달하고 두번째 인자는 미들웨어 함수를 등록
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 를 등록
module.exports = router;
index.js 코드
var express = require('express');
var app = express();
var router = require('./router.js');
app.use(router);
/*app.use(function (req, res, next) {
res.send('OK');
}
);*/
app.listen (3000,
function() {
console.log("3000포트로 웹서버 실행!");
}
)
코드 실행 후
http://127.0.0.1:3000/ or http://localhost:3000/ 브라우저 접속
결과
RESTful API를 간편하게 호출할 수 있게 해주는 도구를 설치하여 다시 코드를 실행시켜보자.
설치 주소 : https://insomnia.rest/
더하기 버튼을 눌러 새로운 http 요청을 만들 수 있음.
new request 버튼을 눌러 새 HTTP 요청을 생성.
요청의 이름은 Express router로 정함
Get 이라고 써있는 셀렉트 박스를 눌러 HTTP 메서드를 변경가능
Send 버튼을 클릭하면 HTTP 요청이 웹서버로 전송됨.
셀렉트 박스를 클릭해 HTTP 메서드를 변경할 수 있음.
ronter.js 코드
var express = require('express');
var router = express.Router();
// 첫번째 인자로는 요청을 처리할 uri 를 전달하고 두번째 인자는 미들웨어 함수를 등록
router.get('/:id', function(req, res, next) {
res.send('파라미터: ' + req.params.id );
});
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 를 등록
module.exports = router;
insomnia 실행
실패 원인 : 루트의 GET 메서드를 처리하는 라우터를 파라미터를 받도록 변경하였기 때문
따라서 매칭되는 라우터가 없기 때문에 출력되는 것이다.
서버 주소 뒤에 임의의 숫자를 입력하여 파라미터를 전달해준다.
http://localhost:3000/1234
URI를 통해 값을 전달하는 또 하나의 방법
RESTAPI에서는 주로 자원을 검색, 필터링 할 때 사용
ex) /books?author=홍길동&language=kr
예를 들어 책을 검색할 때 저자와 언어를 선택해서 해당하는 리스트의 책들만 돌려주는 API
var express = require('express');
var router = express.Router();
// 첫번째 인자로는 요청을 처리할 uri 를 전달하고 두번째 인자는 미들웨어 함수를 등록
router.get('/:id', function(req, res, next) {
res.send('파라미터: ' + req.params.id );
});
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('Year: ' + req.query.year);
});
//module.exports에 만든 익스프레스 router 를 등록
module.exports = router;
결과
http://localhost:3000/?year=2020
: 자원을 등록, 수정하기 위해 사용하는 POST, PUT 메서드에서만 사용가능하다.
1. POST,PUT메서드는 HTTP요청에 Body전달 가능
2. Body에는 text,json,xml,html,파일, 이미지, 동영상 등 어느 것이라도 전송될 수 있음
3. Body는 Content-type 헤더에 따라 적절히 해석되어야 함
4. json 문자열이라면 JSON.parse 함수로 자바스크립트 객체로 변환하여야 코드에서 사용하기 쉽다.
: post 함수를 수정해 http body에 담겨 전달된 json 객체의 title 프로퍼티를 클라이언트에 전송하는 예제
index.js 코드
var express = require('express');
var app = express();
var router = require('./router.js');
/*json 을 파싱해도 되지만 익스프레스에는 content type이 json 인 경우 자동으로 자바스크립트 객체로 변환해주는 편리한 미들웨어를 기본 제공*/
app.use(express.json());
app.use(router);
/*app.use(function (req, res, next) {
res.send('OK');
}
);*/
app.listen (3000,
function() {
console.log("3000포트로 웹서버 실행!");
}
)
ronter.js 코드
var express = require('express');
var router = express.Router();
// 첫번째 인자로는 요청을 처리할 uri 를 전달하고 두번째 인자는 미들웨어 함수를 등록
router.get('/:id', function(req, res, next) {
res.send('파라미터: ' + req.params.id );
});
router.post('/', function(req, res, next) {
res.send('제목: ' + req.body.title);
});
router.put('/', function(req, res, next) {
res.send('PUT /');
});
router.delete('/', function(req, res, next) {
res.send('Year: ' + req.query.year);
});
//module.exports에 만든 익스프레스 router 를 등록
module.exports = router;
JSON선택
POST선택 후 send하기.
{
"title": "제목입니다"
}