현재 OData v3을 사용하고 있습니다. 그러나 OData v4에서도이 방법은 실패합니다. Uri가 앰퍼샌드를 이스케이프 처리했을 때 OData 필터 옵션이 실패합니다.
는의가 열린 다음 I가 있다고 가정 해 봅시다 :? = fieldID가 EQ 1 & $ 위로http://myurl.com/odata/SomeEndpoint $ 필터 = 10
퍼펙트, 우편 배달부 나 브라우저에 그것을 입력 잘 작동합니다. 그러나 만약 내가 우리를 인코딩한다면 그것은 실패한다.
HTML 인코딩 :?
http://myurl.com/odata/SomeEndpoint $ 필터 = fieldID가 EQ 1 & A; $ 가기 = 이스케이프 문자가 쿼리 (그래서 $ 필터는 여전히 작동)에 적용받을 전에 10
모든하지만, 모든 후 이스케이프 된 문자는 무시됩니다 ($ top은 적용되지 않습니다).
URI 인코딩 (I 모두 시도) :?
http://myurl.com/odata/SomeEndpoint $ 필터 = fieldID가 EQ 1 % 26 $ 가기 = http://myurl.com/odata/SomeEndpoint 10 $ 필터 = fieldID가 EQ 1 % 26 % $ 가기 = 10
모두 원인 (이 메모리에서이기 때문에 의역) 다음과 같은 오류와 함께 쿼리 옵션을 적용 할 때 하나로, OData는 예외를 던져 : 당신이 볼 수 있듯이
'&' is in invalid character in query string.
$filter=FieldId eq 1&$top=10
,이 원치 않는 문제입니다. 제 의뢰인이 요청을 보내기 전에 우 리를 인코딩하면 작동하지 않습니다. 또한 결과에서 OData에 의해 생성 된 링크는 다음 페이지 링크와 같이 인코딩됩니다.
< 링크 rel = "다음"href = "http://myurl.com/odata/SomeEndpoint?$filter= fieldID가 % 20eq % (201) & A; $ = 1 "/ >
중 하나로, OData는 잘 작동하지만 $ 건너가 실제로 때문에 탈출 앰퍼샌드 무시됩니다 20 % (공간) 상관하지 않는 것 (& A를 건너 ;) 실제 앰퍼샌드 (&)로 변경하면 정상적으로 작동합니다.
해결 방법이 있습니까? OData의 문제인 것 같습니다. 여기에 참고로
내가 내 경로를 매핑하고있어 어떻게 : 난 아무것도 정의를하고 있지 않다
#pragma warning disable CS0618 // OData v3 route mapping.
config.Routes.MapODataRoute(
routeName: "odata",
routePrefix: "odata",
model: model);
#pragma warning restore CS0618
. 내가 얻을 XML로 내 동의 헤더를 설정
:
UPDATE
< 링크에 rel = "다음"HREF = "http://myurl.com/odata/SomeEndpoint?$filter=FieldId% ? "http://webapi.mydlweb.com/api/test/odata/v3/Checks $ 필터 = STOREID % 20eq % 2040 & 페이지 크기 = 1 :; 20eq % (201) & A $은 = 1":
odata.nextLink/>
내가 얻을 JSON으로 내 동의 헤더를 설정하면 "건너 뛰기 & $ skip = 1 "
아래의 주석에 따라 JSON 링크가 올바르게 생성됩니다. 나는 그것을 클릭 할 수 있으며 앰퍼샌드가 인코딩되지 않았기 때문에 작동한다. 그러나 XML 링크는 앰퍼샌드를 인코딩하므로 작동하지 않습니다. 그런 다음 XML을 인코딩 할 때 정상입니까?그렇다면 클라이언트는 어떤 앰퍼샌드를 "인코딩 해제"하고 인코딩 된 상태로 남길지 어떻게 알 수 있습니까? 예를 들어, 쿼리 문자열을 분리하지 않고 필터 내부에서 앰퍼샌드를 사용하면 인코딩해야합니다.
업데이트 2 : 나는 그것이 XML 인코딩이라고 생각한다.
을 한 눈에,이 작동하는 방법처럼 보인다. 앰퍼샌드를 이스케이프하면 구문 분석기가이를 쿼리 문자열 구분 기호로 해석하지 않고 문자 그대로의 값으로 해석하게됩니다. 따라서, 예에서 $ 필터의 일부로 앰퍼샌드 (및 쿼리 문자열 요청)를 포함하려고 시도하는 것으로 보입니다. –
필터는 JUST ** $ filter = StoreId eq 40이어야합니다. ** 나머지는 "$ skip"또는 "pagesize"는 필터의 일부가 아니라 다른 쿼리 문자열입니다. –