REST = Representational Sate Transfer (로이 필딩)
REST API : 웹에서 사용되는 데이터나 자원을 HTTP URI로 표현하고 HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식.
아래는 각 단계에 따른 예시
룰루가 영화 예매를 하고자 할 때
🟡 0단계
POST/tickets HTTP/1.1
[헤더 생략]
{
"date": "2022-10-03",
"movie" : "league of legends"
}
HTTP/1.1 200 OK
[헤더 생략]
{
"timetable" : [
{"id":"123","movie":"league of legends", "start": "10:00", "end":"12:00"},
{"id":"124","movie":"league of legends", "start": "14:00", "end":"16:00"}
]
}
POST/tickets HTTP/1.1
[헤더 생략]
{
"movie" : "league of legends",
"start": "14:00",
"end":"16:00",
"audience" : "lulu"
}
HTTP/1.1 200 OK
[헤더 생략]
🟡 1단계
POST/movies HTTP/1.1
[헤더 생략]
{
"date": "2022-10-03"
}
요청시 /movies/라는 엔드 포인트 사용.
HTTP/1.1 200 OK
[헤더 생략]
{
"timetable" : [
{"id":"123","movie":"league of legends", "start": "10:00", "end":"12:00"},
{"id":"124","movie":"league of legends", "start": "14:00", "end":"16:00"}
]
}
POST/timetable/124 HTTP/1.1
[헤더 생략]
{
"audience" : "lulu"
}
timetable이라는 리소스의 124라는 id를 가진 리소스가 변경되기 때문에
요청 2에서는 엔드포인트로 timetable/124를 사용
=> 이처럼 어떤 리소스를 변화시키는지, 어떤 응답이 제공되는지에 따라 각기 다른 엔드 포인트 사용.
=> 엔드포인트 디자인은 언제 어떻게 요청되는가보다는 어떤 응답이 제공되는지, 어떤 리소스의 상태를 변화시키는지가 중요.
//이 버튼을 누르면 예약 요청이 전송되니까 아래와 같이 작성(X)
POST/click
//예약 진행 후 124번 자리를 확보할 수 있으니 아래와 같이 작성 (0)
POST/timetable/124
HTTP/1.1 200 OK
[헤더 생략]
{
"tickets" : {
"timetable" : { "id" : "124", movie: "league of legends",...},
"audience" : "lulu"
}
}
HTTP/1.1 409 Conflict
[헤더 생략]
{
"ticketsFailure" : {
"timetable" : { "id" : "124", movie: "league of legends",...},
"audience" : "lulu",
"reason" : "it's sold out!"
}
}
요청에 따른 응답으로 리소스 전달할 때 사용한 리소스에 대한 정보와 함께
성공/실패 여부도 반환해야 함.
🟡 2단계
GET/movies/leagueoflegends/timetable?date=2022-10-03 HTTP/1.1
[헤더 생략]
GET 매서드는 body를 가지지 않기 때문에 query parameter(?로 시작하는 부분)를 사용해 필요한 리소스 전달.
HTTP/1.1 200 OK
[헤더 생략]
{
"timetable" : [
{"id":"123","movie":"league of legends", "start": "10:00", "end":"12:00"},
{"id":"124","movie":"league of legends", "start": "14:00", "end":"16:00"}
]
}
POST/timetable/124 HTTP/1.1
[헤더 생략]
{
"audience" : "lulu"
}
HTTP/1.1 201 Created
Location: timetable/124/tickets
[헤더 생략]
{
"tickets" : {
"timetable" : { "id" : "124", movie: "league of legends",...},
"audience" : "lulu"
}
}
예약을 생성하기 위해서 POST 매서드를 사용해 요청을 보내고,
POST 요청에 대해 응답으로 새로 생성된 리소스를 보내주기 때문에 응답코드는 201 Created로 명확하게 작성.
관련 리소스를 클라이언트가 Location 헤더에 작성된 URI를 통해 확인할 수 있도록 함.
❗️HTTP 매서드 사용 규칙
1. GET 매서드는 서버의 데이터 변화시키지 않는 요청에 사용.
2. POST 매서드는 요청마다 새로운 리소스 생성,
PUT 매서드는 요청마다 같은 리소스를 반환.
⇒ 매 요청마다 같은 리소스 반환하는 특징을 ‘멱등(idempotent)하다’라고 함.
⇒ 멱등성을 가지는 PUT과 아닌 POST 구분해서 사용.
3. PUT(교체)과 PATCH(수정) 매서드 구분 사용 필요.
🟡 3단계
GET/movies/leagueoflegends/timetable?date=2022-10-03 HTTP/1.1
[헤더 생략]
HTTP/1.1 200 OK
[헤더 생략]
{
"timetable" : [
{"id":"123","movie":"league of legends", "start": "10:00", "end":"12:00"},
{"id":"124","movie":"league of legends", "start": "14:00", "end":"16:00"}
],
"links":{
"tickets":{
"href" : "http//localhost:8080/timetable/124",
"method": "POST"
}
}
}
예약 가능 시간을 확인한 후 그 시간대에 해당할 수 있는 링크를 삽입
POST/timetable/124 HTTP/1.1
[헤더 생략]
{
"audience" : "lulu"
}
HTTP/1.1 201 Created
Location: timetable/124/tickets
[헤더 생략]
{
"tickets" : {
"timetable" : { "id" : "124", movie: "league of legends",...},
"audience" : "lulu"
},
"links" : {
"self" : {
"href":"http://localhost:8080/timetable/124",
"method": "GET"
},
"cancel":{
"href":"http://localhost:8080/timetable/cancel",
"method": "DELETE"
}
}
}
특정 시간대 예약 완료 후 그 예약 확인할 수 있는 링크 작성하거나 취소할 수 있는 링크 작성할 수 있음.
API를 이용하기 위해서 필요.
서버의 문을 여는 열쇠 역할.
❓서버 운용에 비용이 발생하므로 아무 조건 없이 익명 클라이언트에게 데이터 제공할 의무 없음.
✅ API Key가 필요한 경우에는 로그인한 이용자에게 자원에 접근할 수 있는 권한을 API Key의 형태로 제공하고, 데이터를 요청할 때 API key를 같이 전달해야 원하는 응답을 받을 수 있음.
잘보고가욥 프로페서 :D