2017-04-11 9 views
2

[HttpGet] 개체 컬렉션을 반환하는 GetCats()이라는 웹 API 메서드가 있습니다.복잡한 매개 변수를 GET 요청으로 전달

페이징을 허용하는 매개 변수 skiptake을 추가했습니다.

그러나 요구 사항이 증가했으며 이제는 "PropertyName", "Value", "Type" 형식의 필터 모음의 경우 복잡한 필터링이 발생할 수 있습니다. "CatName", "Mittens", "EqualTo" 및 정렬 필터는 "PropertyName", "Direction" 형식으로. "CatAge", "Descending".

Skip and Take도 필요합니다.

이 필터 객체를 빌드하면 크기가 매우 커질 수 있습니다. 결과적으로 으로 보이지 않으므로 더 이상 QueryString에 넣을 수 없습니다. 특히 여러 필터가있는 경우 특히 함께 그룹화 할 방법이 필요합니다.

해결책을 찾고 있는데요. [HttpPost]을 사용할 수 있다고 생각합니다. 필터를 게시하면되지만 HTTP 방식에서는 잘못된 것처럼 보입니다. 어떻게 든 개체를 쿼리 문자열에 인코딩하고 정상적으로 디코딩 할 수 있는지 잘 모르겠습니다.

누구든지이 문제를 해결할 수 있습니까? 복잡한 데이터를 GET에 전달하여 데이터 컬렉션을 검색하는 것이 일반적인 문제인 것으로 의심됩니다.

+0

예, 쿼리 문자열에 절대적으로 복잡한 개체를 전달할 수 있습니다. 기본적으로 WebAPI는 게시물에 대한 본문의 가져 오기 및 개체에 대한 쿼리 문자열의 개체를 필요로합니다. 그리고 네, URL이 용량에 도달하면 항상 복잡한 객체를 게시 할 수 있습니다. –

답변

2

실용적인 쿼리 케이스의 경우 일반 쿼리 매개 변수를 사용할 수 있다고 생각합니다.

IIS에서 기본 쿼리 문자열 제한은 2048입니다. 이것은 기본적으로 40-100 개의 개별 쿼리 문자열 매개 변수에 대해 꽤 길며, 이름을 짧게 유지하면 더 많습니다. 필요에 따라 숫자를 늘릴 수도 있습니다 (IIS Request Limits).

매개 변수가 충분히 복잡하면 JSON 및 단일 쿼리 매개 변수로 변환 할 수 있습니다.

이데올로기 적 반대 ("REST 인터페이스 여야 함"과 같은) 또는 기술적 인 이유가없는 한 (캐싱이 필요하고 CDN이 POST 요청의 캐싱을 허용하지 않는 한) 매개 변수를 게시하는 데는 아무런 문제가 없습니다. 또는 GET을 고수하고 싶다면 더 많은 매개 변수를 헤더에 넣을 수 있습니다 (하지만 이는 매우 해킹 된 느낌이며 많은 것을 사지 않습니다).

+0

JSON은 쿼리 문자열로 이동하는 방법이라고 생각합니다. 개체 컬렉션을 전달하는 경우 문제는 쿼리 문자열에 넣고 사용하지 않는 것입니다. 'GetCats?Name & Direction = Descending = 당신은 사용자 정의 구문 분석을 할 수 있습니다. 그러나 MVC가 모든 Name/Filter/Value 쿼리를 분리 할 수 ​​있다고 생각하지 않습니다 (이중 중복이 있음) 커스텀 밸류 프로 바이더 (custom value provider) 등을 쓰지 않고 필터 모음에 넣을 수 있습니다. 감사. 요청 제한에 대해서도 잘 알고 있습니다. 나는 깨닫지 못했습니다. – NibblyPig

0

GET 요청에 대해이를 수행하는 방법은 쿼리 문자열입니다.

앞에서 설명한 것처럼 POST 요청의 경우 데이터가 본문에 전달 될 수 있습니다.

정교하지 않은 방법은 HTTP 헤더를 사용하여 정보를 보내는 것이지만 일부 순수 주의자와 잘 어울리지 않을 수 있습니다 !! 또한 일부 네트워크에서는 문제가 발생할 수 있습니다.

디자인에서 허용되는 것과 작동하는 것의 균형을 찾아야합니다.

관련 문제