정기적으로 목록 업데이트를받을 웹 서비스를 설계하고 있습니다. 이 시점에서 목록은 여전히 단일 엔터티 (/lists/myList
) 또는 많은 리소스가 포함 된 실제 모음 (/lists/myList/entries/<ID>
)으로 모델링 될 수 있습니다. 목록은 크고 (수백만 개의 항목) 업데이트가 적습니다 (종종 10 개 미만의 변경 사항).HTTP ReST : 대규모 콜렉션 업데이트 : JSON PATCH보다 나은 접근법?
배포 할 웹 서비스 URL 및 목록을 얻을 것이다 클라이언트, 예를 들면 :
- http://hostA/service/lists : 목록 1,
- http://hostB/service/lists리스트 2 :리스트 2,
- http://hostC/service/lists 목록 3 : 목록 1, 목록 3
그러면 목록 및 업데이트가 구성된대로 푸시됩니다. 웹 서비스 URL 뒤에 데이터베이스가있는 경우에는 가능성이 있지만 결정되지 않습니다.
저는 연구 중이며 HTTP 패치가 JSON 패치 형식을 사용하는 것이 가장 좋은 방법이라고 생각합니다.
컨텍스트 및 예 : 각 목록에는 식별 이름, 우선 순위 및 수백만 개의 항목이 있습니다. 각 항목에는 ID (클라이언트가 결정한)와 몇 가지 선택적 속성이 있습니다. 예 우선 순위 1 개의 목록 항목이 목록 "requiredItems"를 만들 수 있습니다 :
PUT /lists/requiredItems
Content-Type: application/json
{
"priority": 1,
"entries": {
"1": {
"color": "red",
"validUntil": "2016-06-29T08:45:00Z"
},
"2": {
"country": "US"
}
}
}
업데이트의 경우, 클라이언트는 먼저 목록이 서버에 지금 어떻게 생겼는지 알고 있어야합니다. 이를 위해 목록 엔티티에 속성 "개정"을 추가합니다.
그럼,이 속성을 조회 할 것이다 :
GET /lists/requiredItems?property=revision
그런 다음 클라이언트가 서버의 개정 및 클라이언트에 의해 알려진 최신 버전 사이에 변경하고 JSON 패치를 구성 할 필요가 무엇을 볼 것입니다. 예 :
PATCH /list/requiredItems
Content-Type: application/json-patch+json
[
{ "op": "test", "path": "revision", "value": 3 },
{ "op": "add", "path": "entries/3", "value": { "color": "blue" } },
{ "op": "remove", "path": "entries/1" },
{ "op": "remove", "path": "entries/2/country" },
{ "op": "add", "path": "entries/2/color", "value": "green" },
{ "op": "replace", "path": "revision", "value": 10 }
]
질문 :
- 이러한 접근 방식은 약간 덜 클라이언트 지원의 단점이 때문에하지-자주 사용되는 HTTP 동사의 패치. HTTP 호환성을 떨어 뜨리지 않으면 서 호환 가능한 접근 방식이 있습니까? (idempotency et cetera)? 모든 작업이 적용
- 별도의 리소스로 개별 목록 항목을 모델링하고 (
ETag
및/또는If-Match
와 아마)PUT
및DELETE
를 사용은 옵션 (PUT /lists/requiredItems/entries/3
,DELETE /lists/requiredItems/entries/1
PUT /lists/requiredItems/revision
)을 보이지만, 어떻게 내가 확인 할 때 네트워크 방울을 업데이트 체인의 중간에? HTTP PATCH가 여러 리소스에서 작동 할 수 있습니까? - 목록을 '버전 화'하는 더 좋은 방법이 있습니까? 아마도 암시 적으로 어떻게 업데이트되어 업데이트 될까요? 클라이언트는 개정 번호를 결정합니다.
GET /lists/requiredItems?property=revision
으로 수정 번호를 쿼리하는 것이 맞습니까?/lists/requiredItems/revision
과 같은 별도의 리소스 여야합니까? 별도의 리소스 여야하는 경우이를 어떻게 자동으로 업데이트합니까 (예 : 목록 및 수정 버전이 모두 업데이트되었거나 업데이트되지 않은 경우)?- JSON 패치에서 수정 값을 먼저 테스트하여
3
이되도록하고 같은 패치에서10
으로 업데이트 하시겠습니까?
한 번에 두 가지 이상의 질문을하지 마십시오. 그들 모두는 유효하지만 아마도 그들 모두에 대한 대답을 얻지 못할 것입니다. –
@LutzHorn : 감사합니다. 당신 말이 맞아요. 한 가지 질문 만 제외하고 나머지는 별도로 다시 게시해야합니까? 소개 부분은 동일합니다 ... –