나는 그들이 일반적으로 이것을 위해 설계하기 때문에 이것을 처리하기 위해 POST 또는 PATCH 방법을 사용할 수 있다고 생각합니다.
POST
메소드 사용 은 일반적으로 목록 리소스에서 사용될 때 요소를 추가하는 데 사용되지만이 메소드에 대해 여러 작업을 지원할 수도 있습니다. 이 답변 : How to Update a REST Resource Collection을 참조하십시오 . 입력에 대해 다른 표현 형식을 지원할 수도 있습니다 (배열 또는 단일 요소에 해당하는 경우).
이 경우 업데이트를 설명하기 위해 형식을 정의 할 필요가 없습니다.
PATCH
해당 요청이 부분 업데이트에 해당하므로 메서드를 사용하는 것도 적합합니다. RFC5789 ( http://tools.ietf.org/html/rfc5789 ) 에 따르면 :
HTTP (Hypertext Transfer Protocol)를 확장하는 여러 응용 프로그램에는 부분적인 리소스 수정 기능이 필요합니다. 기존 HTTP PUT 방법은 문서의 완전한 대체 만 허용합니다. 이 제안은 기존 HTTP 리소스를 수정하기 위해 새로운 HTTP 메소드 인 PATCH를 추가합니다.
이 경우 부분 업데이트를 설명하는 형식을 정의해야합니다.
나는이 경우에 그 생각, POST
그리고 PATCH
당신이 정말로 각 요소에 대해 수행 할 작업을 설명 할 필요가 없기 때문에 매우 유사하다. 보낼 표현의 형식에 따라 달라집니다.
의 경우 PUT
는 좀 덜 명확합니다. 사실, 메소드를 사용할 때 PUT
전체 목록을 제공해야합니다. 사실, 요청에 제공된 표현은 목록 리소스 1을 대체합니다.
리소스 경로와 관련하여 두 가지 옵션이 있습니다.
이 경우 요청에서 제공하는 표현에 바인더가있는 문서의 링크를 명시 적으로 제공해야합니다.
다음은 이에 대한 샘플 경로입니다 /docs
.
이러한 접근 방식의 내용은 다음과 POST
같습니다.
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
또한 문서와 바인더 간의 링크를 설명하기 위해 하위 경로를 활용하는 것도 고려할 수 있습니다. 문서와 바인더 간의 연결에 대한 힌트는 이제 요청 콘텐츠 내에서 지정할 필요가 없습니다.
다음은 이에 대한 샘플 경로입니다 /binder/{binderId}/docs
. 이 경우 문서 목록을 메서드와 함께 보내 POST
거나 PATCH
문서 binderId
가없는 경우 문서를 만든 후 식별자를 사용하여 바인더에 문서를 첨부 합니다.
이러한 접근 방식의 내용은 다음과 POST
같습니다.
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
응답과 관련하여 응답 수준과 반환 할 오류를 정의하는 것은 사용자의 몫입니다. 상태 수준 (글로벌 수준)과 페이로드 수준 (얇은 수준)의 두 가지 수준이 있습니다. 또한 요청에 해당하는 모든 삽입 / 업데이트가 원자 적이어야하는지 여부를 정의하는 것은 사용자의 몫입니다.
이 경우 HTTP 상태를 활용할 수 있습니다. 모든 것이 잘되면 상태가 200
됩니다. 그렇지 않은 400
경우 제공된 데이터가 올바르지 않거나 (예 : 바인더 ID가 유효하지 않음) 다른 상태와 같은 다른 상태 입니다.
이 경우 상태 200
가 반환되고 수행 된 작업과 결국 오류가 발생하는 위치를 설명하는 것은 응답 표현에 달려 있습니다. ElasticSearch에는 대량 업데이트를 위해 REST API에 엔드 포인트가 있습니다. 이 수준에서 몇 가지 아이디어를 얻을 수 있습니다. http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
제공된 데이터를 처리하기 위해 비동기 처리를 구현할 수도 있습니다. 이 경우 HTTP 상태 반환은입니다 202
. 클라이언트는 어떤 일이 발생하는지 확인하기 위해 추가 리소스를 가져와야합니다.
완료하기 전에 OData 사양이 내비게이션 링크 라는 기능을 사용하여 엔티티 간의 관계에 관한 문제를 해결하고 있음을 알고 싶습니다 . 아마도 당신은 이것을 볼 수 있습니다 ;-)
다음 링크도 도움이 될 수 있습니다 : https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
도움이 되었기를 바랍니다, Thierry
GET /docs
특정 바인더 내의 모든 문서를 호출 하고 검색합니다GET /docs?binder_id=x
. 자원의 부분 집합 내가 부를 것이다 삭제DELETE /docs?binder_id=x
또는 내가 전화해야DELETE /docs
로모그래퍼{"binder_id": x}
요청 본문에?PATCH /docs?binder_id=x
일괄 업데이트에 사용 하시겠습니까 , 아니면 그냥PATCH /docs
통과 쌍을 사용 하시겠습니까?