2015-01-09 4 views
1

이것은 매우 기본적인 질문 인 것 같습니다. 유용한 자료의 방향으로 나를 가리켜 주 시옵소서.더 많은 양의 데이터를 stateless RESTful 검색 서비스로 보내는 방법

그래서 일부 데이터를 검색하는 RESTful 서비스가 있습니다. 그러나 RESTful 서비스는 검색을 수행하기 위해 일정량의 데이터가 필요합니다. 이 데이터는 대략 "사용자 컨텍스트"데이터 - 서비스가 검색 작업을 수행하는 데 사용해야하는 사용자 (호출 응용 프로그램에 의해 저장되었거나 다른 응용 프로그램에서 이전에 검색되었는지 여부)에 대한 정보로 요약 될 수 있습니다.

REST가 의미 론적으로 작동하므로 무언가를 검색하는 올바른 동사 (HTTP 메서드)는 GET 요청입니다. 소량의 데이터 만 사용하는 것으로 보이는 대부분의 예 GET 요청은 데이터가 URL로 전달됩니다. 그러나 검색을 위해 더 많은 양의 데이터가 필요한 서비스 영역에 들어가게되면 모든 정보를 URL에 넣는 것이 잘못된 것처럼 보입니다. 뿐만 아니라 특정 구성 요소 (종종 255 자 정도의 IIRC)에 의해 시행되는 URL 길이에는 알려진 제한이 있습니다.

겉보기 사용할 수있는 옵션은 다음과 같습니다

  • 를 사용하여 POST 요청 본문에 데이터를 보낼 수 있습니다. 그러나 우리는 아무것도 업데이트하지 말고 검색 만하기 때문에 의미가 없습니다.
  • 더 많은 부분의 정보 (내 경우에는 "사용자 컨텍스트")를 HTTP 헤더에 넣으십시오. 그러나 헤더가 헤더가 아니라 데이터로 사용되어야하므로 "잘못된 느낌"이 있습니다.
  • 여러 개의 요청을 만들어 여러 URL로 데이터를 보냅니다. 그러나 이것은 서비스가 요청을 함께 묶을 수있는 상태를 유지해야하기 때문에 무국적 목표를 깨뜨리는 것으로 보입니다.
  • 데이터를 데이터베이스에 쓴 다음 서비스에서 키를 전달하여 거기에서 데이터를 검색하십시오. 그러나 이로 인해 요청 자체가 포함되지 않으며 성능 병목 현상이 발생합니다.

다른 옵션이 있습니까? 가장 좋은 방법은 무엇입니까?

답변

1

요청 경로 (URL)와 마찬가지로 HTTP 헤더는 제한적으로 제한되어 있지만 제한된 길이의 링크가 있습니다 (아래 링크 참조).

당신 조정하거나 서버 제한을 ​​제거,하지만 당신이 더 힘들어 (예 : HTTP 캐시 등) 제 3 자 시스템과의 호환성을 유지하기 위해 만들어 주겠다고, 임의의 HTTP 클라이언트가 사실상의 한계를 뛰어 넘을 것이라는 보장은 없습니다.

임의로 많은 양의 데이터를 서버에 호환 방식으로 보내는 유일한 방법은 요청 본문을 사용하는 것입니다. 표준 HTTP 동사 중 POST 및 PUT 요청에만 본문이있을 수 있으며 그 중 PUT은 수행하려는 것과 의미 상으로 호환되지 않습니다.

필요한 모든 정보가 URL 또는 요청 헤더에 항상 맞는지 (위에서 언급 한 제한 사항을 고려하여) 보장 할 수없는 경우 POST 요청을 통해 이러한 요구를 표현하도록 REST API를 설계해야합니다.

POST 동사가 서버에서 무언가를 수정하거나 만들 때만 사용된다는 오해입니다.실제로, 다른 동사가 멱등수 (부작용이없고 중복 요청을 수행하면 중복 결과가 생성되어야 함)이므로 POST는 이러한 요구를 충족시킬 수있는 유일한 동사이지만 일반적으로 POST는 포괄적 인 것입니다 다른 동사는 잘하지 못합니다.

GET의 제한 사항을 다르게 해결할 수없는 경우 POST가 검색 (리디렉션의 결과가 더 많음) 또는 처리 동사로 합법적으로 사용될 수 있습니다. POST 응답은 캐싱 관련 응답 헤더 (예 : Cache-ControlExpires)를 설정하여 GET과 유사하게 동작하도록 만들 수도 있습니다.

관련 문제