[TIL] REST API, OPEN API

ㅜㅜ·2022년 10월 6일
1

Today I learn

목록 보기
29/77
post-thumbnail

REST API

  • REST = Representational Sate Transfer (로이 필딩)

  • REST API : 웹에서 사용되는 데이터나 자원을 HTTP URI로 표현하고 HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식.



리차드슨의 REST 성숙 모델

  • REST API 작성 시 지켜야 할 규칙

아래는 각 단계에 따른 예시
룰루가 영화 예매를 하고자 할 때


🟡 0단계

  • 요청 1 : 티켓 예매 가능한 시간 확인
POST/tickets HTTP/1.1
[헤더 생략]

{
  "date": "2022-10-03",
  "movie" : "league of legends"
}

  • 요청 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"}
    ]
}

  • 요청 2 : 특정 시간에 예매
POST/tickets HTTP/1.1
[헤더 생략]

{
  "movie" : "league of legends",
  "start": "14:00", 
  "end":"16:00",
  "audience" : "lulu"
}

  • 요청 2에 대한 응답
HTTP/1.1 200 OK
[헤더 생략]
  • 요청 1과 요청 2에서 동일한 end point 사용하고 있음.

🟡 1단계

  • 요청 1 : 예매 가능한 시간 확인
POST/movies HTTP/1.1
[헤더 생략]

{
  "date": "2022-10-03"
}

요청시 /movies/라는 엔드 포인트 사용.


  • 요청 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"}
    ]
}

  • 요청 2 : 특정 시간에 예매
POST/timetable/124 HTTP/1.1
[헤더 생략]

{
  "audience" : "lulu"
}

timetable이라는 리소스의 124라는 id를 가진 리소스가 변경되기 때문에
요청 2에서는 엔드포인트로 timetable/124를 사용

=> 이처럼 어떤 리소스를 변화시키는지, 어떤 응답이 제공되는지에 따라 각기 다른 엔드 포인트 사용.
=> 엔드포인트 디자인은 언제 어떻게 요청되는가보다는 어떤 응답이 제공되는지, 어떤 리소스의 상태를 변화시키는지가 중요.

//이 버튼을 누르면 예약 요청이 전송되니까 아래와 같이 작성(X)
POST/click

//예약 진행 후 124번 자리를 확보할 수 있으니 아래와 같이 작성 (0)
POST/timetable/124

  • 요청 2에 대한 응답 1 : 성공
HTTP/1.1 200 OK
[헤더 생략]

{
  "tickets" : {
    "timetable" : { "id" : "124", movie: "league of legends",...},
    "audience" : "lulu"
                  }
  }

  • 요청 2에 대한 응답 2 : 실패 (해당 시간 매진)
HTTP/1.1 409 Conflict
[헤더 생략]

{
  "ticketsFailure" : {
    "timetable" : { "id" : "124", movie: "league of legends",...},
    "audience" : "lulu",
    "reason" : "it's sold out!"
                  }
  }

요청에 따른 응답으로 리소스 전달할 때 사용한 리소스에 대한 정보와 함께
성공/실패 여부도 반환해야 함.


🟡 2단계

  • 요청 1 : 예매 가능한 시간 확인
GET/movies/leagueoflegends/timetable?date=2022-10-03 HTTP/1.1
[헤더 생략]

GET 매서드는 body를 가지지 않기 때문에 query parameter(?로 시작하는 부분)를 사용해 필요한 리소스 전달.


  • 요청 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"}
    ]
}

  • 요청 2 : 특정 시간에 예매
POST/timetable/124 HTTP/1.1
[헤더 생략]

{
  "audience" : "lulu"
}

  • 요청 2에 대한 응답 1 : 성공
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단계

  • 요청 1 : 예매 가능한 시간 확인
GET/movies/leagueoflegends/timetable?date=2022-10-03 HTTP/1.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"
   }
 }
}

예약 가능 시간을 확인한 후 그 시간대에 해당할 수 있는 링크를 삽입

  • 요청 2 : 특정 시간에 예매
POST/timetable/124 HTTP/1.1
[헤더 생략]

{
  "audience" : "lulu"
}

  • 요청 2에 대한 응답 1 : 성공
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"
   }
  }
  }

특정 시간대 예약 완료 후 그 예약 확인할 수 있는 링크 작성하거나 취소할 수 있는 링크 작성할 수 있음.






Open API

  • 누구에게나 열려있는 API이지만 무제한으로 이용가능한 것은 아님.
  • API마다 정해진 이용 수칙 존재. 이용 수칙에 따라 제한사항(가격, 정보 제한) 있을 수 있음.




API key

  • API를 이용하기 위해서 필요.

  • 서버의 문을 여는 열쇠 역할.

  • ❓서버 운용에 비용이 발생하므로 아무 조건 없이 익명 클라이언트에게 데이터 제공할 의무 없음.

  • ✅ API Key가 필요한 경우에는 로그인한 이용자에게 자원에 접근할 수 있는 권한을 API Key의 형태로 제공하고, 데이터를 요청할 때 API key를 같이 전달해야 원하는 응답을 받을 수 있음.

profile
다시 일어나는 중

1개의 댓글

comment-user-thumbnail
2022년 10월 6일

잘보고가욥 프로페서 :D

답글 달기