REST 및 베스트 프랙티스

이동욱

2021/03/27

Categories: 네트워크 Tags: REST

REST


REST의 기본


HTTP POST, http://myweb/users/
{
  "users": {
    "name": "terry"
  }
}

HTTP 메서드


download

REST의 리소스


REST API의 간단한 예제


사용자 생성

HTTP POST, http://myweb/users/
{
  "name":"terry",
  "address":"seoul"
}

조회

HTTP GET, http://myweb/users/terry

업데이트

HTTP PUT, http://myweb/users/terry 
{
  "name": "terry",
  "address": "suwon"
}

삭제

HTTP DELETE, http://myweb/users/terry

REST의 특성


유니폼 인터페이스(Uniform Interface)

REST는 HTTP 표준에만 따른다면 어떤 기술이든지 사용할 수 있는 인터페이스 스타일이다. 예를 들어, HTTP + JSON으로 REST APII를 정의했다면, 안드로이드 플랫폼이건 IOS 플랫폼이건 특정 언어나 기술에 종속받지 않고, HTTP와 JSON을 모든 플랫폼에서 사용할 수 있는 느슨한 결합이다.

무상태성/스테이트리스(Stateless)

캐시 가능(Cacheable)

267E914554241E6512

자체 표현 구조(Self-descriptiveness)

클라이언트 서버 구조(Client-Server)


계층형 구조(Layered System)

REST 안티 패턴


다음은 REST API를 디자인할 때 하지 말아야 할 것들이다.

GET/POST를 이용한 터널링

HTTP POST, http://myweb/users/
{
  "getuser": {
    "id": "terry",
  }
}

Self-descriptiveness 속성을 사용하지 않음

HTTP 응답 코드를 사용하지 않음

REST API 디자인 가이드


단순하고 직관적으로 만들어라

리소스 간의 관계를 표현하는 방법

1. 서브 리소스로 표현하는 방법
/"리소스명"/"리소스 아이디"/"관계가 있는 다른 리소스명"
HTTP GET, /users/{userId}/devices
예) /users/1/devices
2. 서브 리소스에 관계를 명시하는 방법
HTTP GET, /users/{userid}/likes/devices
예) /uesrs/1/likes/devices

에러 처리


200 - 성공
400 Bad Request - field validation 실패 시
401 Unauthorized - API 인증, 인가 실패
404 Not Found - 해당 리소스가 없음
500 Internal Server Error - 서버 에러

API 버전 관리


{servicename}/{version}/{REST URL}
예) api.server.com/account/v2.0/groups

페이징


부분 응답 처리


링크드인 : /people:(id, first-name, last-name, industry)
페이스북 : /terry/friends?fields=id, name
구글 : ?fields=title, media:group(media:thumnail)

검색 (전역 검색과 지역 검색)


/users?name=lee&region=seoul

추가적으로 페이징 처리를 추가하면 다음과 같이 된다.

/users?name=cho&region=seoul&offset=20&limit=10
/user?q=name=lee, region=seoul&offset=20&limit=10

예를 들어서 특정 리소스 안에 대한 검색은 다음과 같이 리소스명에 쿼리 조건을 붙이는 식으로 표현할 수 있다.

/users?q=id=seoul

전역 검색은 다음과 같은 식으로 정의할 수 있다.

/search?q=id=lee

HATEOAS를 이용한 처리


{
  [
    {
      "id": "user1",
      "name": "terry"
    },
    {
      "id": "user2",
      "name": "carry"
    }
  ],
  "links": [
    {
      "rel": "pre_page",
      "href": "http://xxx/users?offset=6&limit=5"
    },
    {
      "rel": "next_page",
      "href": "http://xxx/users?offset=11&limit=5"
    }
  ]
}

단일 API 엔드 포인트 활용


참고 문헌

>> Home