RESTful API design.
RESTful API design’s Goals.
- Platform indenpendency.
- Self-evolution.
굳이 HTTP 일 필요는 없다. design 의 문제.
Design Principles.
- Resource 를 중심으로 설계된다.
- Resource 는 고유의 identifier 를 가진다.
- Representation 을 가진다. 보통 JSON.
- 각 Request 는 Stateless, Atomic, Indenpendent 하다.
- Server 의 scale out 을 가능케 한다.
- Indenpendent 하기 때문에 요청의 순서에 신경쓰지 않아도 된다.
Maturity of RESTful HTTP API.
- POST only.
- Resource + URI 분리
- Resource + HTTP methods.
- HATEOAS (+hyperlinks)
보통, 대부분의 RESTful HTTP API 는 2 ~ 3 그 어딘가에 있다.
Design guide.
- No verbs. (Use methods for it!)
- There’s no need to match with database schema. (just abstract it. hide implementation.)
- resource 의 collection 들은 다른 URI 를 가진다.
- ex)
/orders
- ex)
- Resource 의 relationship 은 hierachy 하게 표현한다.
- ex)
/customers/{customer_id}/orders/{order_id}
… - 관계가 너무 많으면 관리가 힘들다. 그러므로 여러번 요청을 날린다던지 너무 계층이 많아지지 않도록 조심한다.
- ex)
- chatty 한 API design 보다는, 하나의 큰 load 를 가진 API 가 낫다. (denormalized API is better)
- 지나친 Overfetching 은 조심해야 한다.
- Abstract database schema. do not expose it.
- Resource 와 관련없는 서버의 function, procedure 를 실행해야 할 경우도 있다. 적당히 사용한다.
HTTP methods.
GET
: Resource’s representation.200
404
POST
: Resource’s creation or call server’s function.201
: creation success.200
: no creation.400
: bad representation.- 생성시
Location
Header 에 resource 의 ID 를 담아서 리턴한다.
PUT
: Create or update resource (w/ complete representation)201
,200
,400
409
(Conflict): Valid 한 요청이지만, Server 의 state 로 인해 update 를 실패했다.- 생성의 경우 Client 가 적절하게 좋은 ID 를 생성할 수 있어야 한다.
PATCH
: Update resource partially200
,400
,409
- Representation fields are optional.
null
means delete the field’s value.
DELETE
: Delete resource.204
(No Content): success
Filter and Pagination
Versioning
- No versioning. acceptable for internal APIs.
- Header versioning.
- ex)
App-Version: ...
- ex)
- Query string versioning.
- ex)
/...?version=1
- ex)
- URI versiong.
- ex)
/v1/...
.
- ex)
- media type versioning.
Open API
TBW. https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design#open-api-initiative