REST API 이해와 설계 - #2 API 설계
- IT 정보/개발관련
- 2017. 1. 11.
조대협 님께서 블로그에 개제 해주신 내용을 보고 정리하였습니다.
출처 : http://bcho.tistory.com/954
● REST API 디자인 가이드
◎ REST URI는 심플하고 직관적으로 만들자
REST API를 URI만 보고도, 직관적으로 이해할 수 있어야 한다. URI를 길게 만드는 것 보다, 최대 2 depth 정도로 간단하게
만드는 것이 이해하기 편하다.
- /dogs
- /dogs/1234
POST /dogs |
- HTTP POST : /getDogs
- HTTP POST : /setDogsOwner
- HTTP GET : /dogs
- HTTP POST : /dogs/{puppy}/owner/{terry}
리소스 |
POST |
GET |
PUT |
DELETE |
create | read |
update |
delete |
|
/dogs |
새로운 dogs 등록 |
dogs 목록을 리턴 |
Bulk로 여러 dogs 정보를 업데이트 |
모든 dogs 정보를 삭제 |
/dogs/badduk |
에러 |
baduk 이라는 이름의 dogs 정보를 리턴 |
baduk이라는 이름의 dogs 정보를 업데이트 |
baduk 이라는 이름의 dogs 정보를 삭제 |
◎ 리소스간의 관계를 표현하는 방법
REST 리소스 간에는 서로 연관관계가 있을 수 있다. 예를 들어 사용자가 소유하고 있는 디바이스 목록이나 사용자가 가지고 있는
강아지들 등이 예가 될 수가 있는데, 사용자 - 디바이스 또는 사용자 - 강아지 등과 같은 각각의 리소스 간의 관계를 표현하는 방법은
여러가지가 있다.
◎ Option 1. 서브 리소스로 표현하는 방법
예를 들어 사용자가 가지고 있는 핸드폰 디바이스 목록을 표현해 보면
- /"리소스명"/"리소스 id"/"관계가 있는 다른 리소스명" 형태
- HTTP GET : /users/{userid}/devices 예) /users/terry/devices
◎ Option 2. 서브 리소스에 관계를 명시하는 방법
만약에 관계의 명이 복잡하다면 관계명을 명시적으로 표현하는 방법이 있다.
예를 들어 사용자가 "좋아하는" 디바이스 목록을 표현해보면
- HTTP GET : /users/{userid}/likes/devices 예) /users/terry/likes/devices
● 에러처리
에러처리의 기본은 HTTP Response Code를 사용한 후, Response body에 error detail을 서술하는 것이 좋다.
대표적인 API 서비스들이 어떤 HTTP Response Code를 사용하는지를 살펴보면 다음과 같다.
구글의 gdata 서비스의 경우 10개, 넷플릭스의 경우 9개, Digg의 경우 8개의 Response Code를 사용한다.
◎ Google GData
200 201 304 400 401 403 404 409 410 500
◎ Netflix
200 201 304 400 401 403 404 412 500
◎ Digg
200 400 401 403 404 410 500 503
- 200 Success - 성공
- 400 Bad Request - field validation 실패시
- 401 Unauthorized - API 인증, 인가 실패
- 404 Not found - 해당 리소스가 없음
- 500 Internal Server Error - 서버 에러
- HTTP Status Code : 401
- {"status":"401","message":"Authenicate","code":"20003,"more
info":"http://www.twillo.com/docs/errors/20003"}
● API 버전 관리
API 정의에서 중요한 것 중의 하나는 버전 관리이다. 이미 배포된 API의 경우에는 계속해서 서비스를 제공하면서,
새로운 기능이 들어간 새로운 API를 배포할 때는 하위 호환성을 보장하면서 서비스를 제공해야 하기 때문에,
같은 API라도 버전에 따라 다른 기능을 제공하도록 하는 것이 필요하다.
조대협님께서는 다음의 형태로 정의하는 것을 권장한다.
- {servicename}/{version}/{REST URL}
- example) api.server.com/account/v2.0/groups
● 페이징