Program Tip

REST (RESTful) API를 통한 대량 수집 조작

programtip 2020. 10. 30. 20:29
반응형

REST (RESTful) API를 통한 대량 수집 조작


클라이언트가 많은 수의 개체를 컬렉션에 효율적으로 추가 / 제거 할 수 있도록 REST API를 설계하는 방법에 대한 조언을 받고 싶습니다.

API를 통해 클라이언트는 컬렉션에 항목을 추가하고 컬렉션에서 항목을 제거하고 기존 항목을 조작 할 수 있어야합니다. 많은 경우 클라이언트는 컬렉션에 대한 대량 업데이트 (예 : 1000 개의 항목 추가 및 500 개의 다른 항목 삭제)를 원할 것입니다. 클라이언트가 1000 개의 개별 POST 요청과 500 개의 DELETE를 요구하는 대신 서버와의 단일 트랜잭션에서이를 수행 할 수 있어야하는 것처럼 느껴집니다.

누구든지 이것을 달성하기위한 모범 사례 또는 규칙에 대한 정보가 있습니까?

내 현재 생각은 컬렉션 URI의 변경 사항을 나타내는 객체를 PUT 할 수 있어야한다는 것입니다. 그러나 이것은 HTTP 1.1 RFC 와 상충 되는 것 같습니다. 이는 PUT 요청으로 전송 된 데이터가 URI에 이미있는 데이터. 이는 클라이언트가 컬렉션의 새로운 상태에 대한 완전한 설명을 한 번에 보내야 함을 의미합니다. 이는 변경 사항보다 훨씬 클 수도 있고 클라이언트가 요청을 할 때 알 수있는 것보다 많을 수도 있습니다.

분명히, 필요한 경우 RFC에서 벗어나는 것이 기쁘지만 그러한 규칙이 존재하는 경우 기존 방식으로 수행하는 것을 선호합니다.


변경 임무를 그 자체로 자원으로 생각할 수 있습니다. 따라서 실제로는 대량 데이터 업데이트 개체 인 단일 개체를 PUT-ing하고 있습니다. 아마도 이름, 소유자, 그리고 파싱하고 실행해야하는 CSV, XML 등의 큰 덩어리가있을 수 있습니다. CSV의 경우 CSV 데이터에 표시되는 개체 유형을 식별 할 수도 있습니다.

작업 나열, 작업 추가, 작업 상태보기, 작업 업데이트 (아마도 시작 / 중지), 작업 삭제 (실행중인 경우 중지) 등. 이러한 작업은 REST API 설계에 쉽게 매핑됩니다.

이 기능이 있으면 대량 데이터 업데이트 프로그램이 처리 할 수있는 다양한 데이터 유형을 쉽게 추가 할 수 있으며, 같은 작업에서 함께 혼합 할 수도 있습니다. 즉, 가져 오려는 각 유형에 대해 동일한 API를 앱 전체에 복제 할 필요가 없습니다.

이것은 또한 백그라운드 작업 구현에 매우 쉽게 적합합니다. 이 경우 API 클라이언트가 알림을받을 방법을 지정할 수 있도록 개별 작업 개체에 필드를 추가 할 수 있습니다 (완료되면 가져 오거나 이메일을 보낼 URL 등). .


예, PUT는 생성 / 덮어 쓰지만 부분적으로 업데이트하지는 않습니다.

부분 업데이트 의미 체계가 필요한 경우 PATCH를 사용하십시오. http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-14.html을 참조하십시오 .


AtomPub를 사용해야합니다 . 특히 HTTP를 통해 컬렉션을 관리하도록 설계되었습니다. 선택한 언어에 대한 구현이있을 수도 있습니다.


POST의 경우 적어도 목록 URL에 게시 할 수 있어야하고 요청 본문에 단일 새 리소스 대신 새 리소스 목록이 포함되어야합니다.


내가 이해하는 한 REST는 REpresentational State Transfer를 의미하므로 클라이언트에서 서버로 상태를 전송해야합니다.

너무 많은 데이터가 앞뒤로 이동하는 것을 의미하는 경우 표현을 변경해야 할 수 있습니다. collectionChange 구조는 처리 인터페이스 URL에 게시 된 일련의 삭제 (ID 별) 및 추가 (내장 된 전체 xml 표현 포함)와 함께 작동합니다. 인터페이스 구현은 서버 측 삭제 및 추가를위한 자체 방법을 선택할 수 있습니다.

가장 순수한 버전은 URL로 항목을 정의하는 것이며 컬렉션에는 일련의 URL이 포함됩니다. 새 컬렉션은 클라이언트에 의해 변경된 후 PUT가 될 수 있고, 추가되는 항목의 일련의 PUT가 뒤 따르고, 해당 목록에서 항목을 제거하는 것이 아니라 실제로 서버에서 항목을 제거하려는 경우 일련의 삭제가 이어질 수 있습니다.


전체 상태를 전송할 필요가없는 기존 컬렉션 요소의 메타 표현을 도입 할 수 있으므로 일부 추상 코드에서 업데이트는 다음과 같을 수 있습니다.

{기존 요소 1-100}
{값이 "bar", "baz"인 새 요소 foo}
{기존 요소 105}
{값이 "bar", "foo"인 새 요소 foobar}
{기존 요소 110-200}

요소 추가 (및 수정)는 해당 값을 정의하여 수행되고, 요소 삭제는 새 컬렉션을 언급하지 않고 수행되며 요소 재정렬은 새 순서를 지정하여 수행됩니다 (순서가 저장되어있는 경우).

이렇게하면 전체 콘텐츠를 다시 전송할 필요없이 전체 새 컬렉션을 쉽게 나타낼 수 있습니다. If-Unmodified-Since헤더를 사용 하면 콘텐츠에 대한 아이디어가 실제로 서버 아이디어와 일치하는지 확인하여 요청이 제출되었을 때 알지 못했던 요소를 실수로 제거하지 않도록합니다.

참고 URL : https://stackoverflow.com/questions/306271/bulk-collection-manipulation-through-a-rest-restful-api

반응형