REST API를 사용하면 모든 관점에서 문제가됩니다.
REST API의 두 가지 주요 개념은 엔드 포인트와 자원 (엔티티)입니다. 느슨하게 말하면, 엔드 포인트는 GET을 통해 자원을 리턴하거나 POST 및 PUT 등을 통해 자원을 승인합니다 (또는 위의 조합).
POST를 사용하면 전송하는 데이터가 새 리소스 및 관련 엔드 포인트를 생성하거나 생성하지 않을 수 있으며 이는 POST 된 URL 아래에 "라이브"되지 않을 가능성이 높습니다. 다시 말해 POST 할 때 처리 할 데이터를 어딘가에 보냅니다. POST 엔드 포인트는 일반적으로 자원을 찾을 수있는 위치가 아닙니다.
RFC 2616 에서 인용 (관련 부품은 생략하고 관련 부품은 강조 표시) :
9.5 POST
POST 메소드는 오리진 서버가 요청에 포함 된 엔티티를 요청 라인의 Request-URI에 의해 식별 된 자원의 새로운 하위 항목으로 승인하도록 요청하는 데 사용됩니다. POST는 균일 한 방법으로 다음 기능을 처리 할 수 있도록 설계되었습니다.
- ...
- 양식 제출 결과와 같은 데이터 블록을 데이터 처리 프로세스에 제공하는 단계;
- ...
...
POST 메소드에 의해 수행 된 조치 로 인해 URI로 식별 할 수있는 자원이 생성되지 않을 수 있습니다 . 이 경우 응답 에 결과를 설명하는 엔터티가 포함되는지 여부 에 따라 200 (OK) 또는 204 (No Content)가 적절한 응답 상태 입니다.
오리진 서버에서 리소스가 생성 된 경우 응답은 201 (생성)이어야합니다.
우리는 문제 영역이 지시하는 모든 것, 사용자, 메시지, 서적 등 '사물'또는 '데이터'를 나타내는 엔드 포인트 및 리소스에 익숙해졌습니다. 그러나 엔드 포인트는 다른 자원 (예 : 검색 결과)을 노출 할 수도 있습니다.
다음 예제를 고려하십시오.
GET /books?author=AUTHOR
POST /books
PUT /books/ID
DELETE /books/ID
일반적인 REST CRUD입니다. 그러나 우리가 추가 한 경우 :
POST /books/search
{
"keywords": "...",
"yearRange": {"from": 1945, "to": 2003},
"genre": "..."
}
이 엔드 포인트에 대해 신뢰할만한 것은 없습니다. 요청 본문의 형식으로 데이터 (엔티티)를 허용합니다. 이 데이터는 검색 기준 이며 다른 것과 마찬가지로 DTO입니다. 이 엔드 포인트는 요청에 대한 응답으로 자원 (엔티티)을 생성합니다. 검색 결과 . 검색 결과 리소스는 임시 리소스로 리디렉션없이 클라이언트에 즉시 제공되며 다른 정식 URL에 노출되지 않습니다.
엔티티가 서적이 아닌 경우를 제외하고 여전히 REST입니다. 요청 엔티티는 서적 검색 기준이고 응답 엔티티는 서적 검색 결과입니다.