2017-09-08 1 views
0

현재 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 인코딩이라고 생각한다.

enter image description here

+1

을 한 눈에,이 작동하는 방법처럼 보인다. 앰퍼샌드를 이스케이프하면 구문 분석기가이를 쿼리 문자열 구분 기호로 해석하지 않고 문자 그대로의 값으로 해석하게됩니다. 따라서, 예에서 $ 필터의 일부로 앰퍼샌드 (및 쿼리 문자열 요청)를 포함하려고 시도하는 것으로 보입니다. –

+0

필터는 JUST ** $ filter = StoreId eq 40이어야합니다. ** 나머지는 "$ skip"또는 "pagesize"는 필터의 일부가 아니라 다른 쿼리 문자열입니다. –

답변

1

당신은 쿼리 문자열에서 앰퍼샌드 탈출하고 쿼리 문자열에 이스케이프 앰퍼샌드처럼 행동하는 기대할 수 없다. 이것은 odata와는 아무런 관련이 없으며 정상적인 쿼리 스트 (querystring) 동작입니다. 이를 이스케이프하면 (자), 파서는 이것을 키와 값의 페어의 단락 문자로 해석하지 않고, 값의 리터럴 앰퍼샌드로서 해석합니다.

예 :이 일하지 않습니다,

https://www.google.com/search?safe=off&q=test 

을 :하지만이 구글에서 검색이 작동

https://www.google.com/search?safe=off%26q=test 
+0

의미가 있지만 자동으로 생성 된 링크는 XML 형식으로 인코딩됩니다. 내 업데이트를 참조하십시오. –

+0

"XML 인코딩이라고 생각합니다."라고 말하면 여러분이 옳습니다. 엄밀히 말하면 XML 파서를 사용하여 XML을 읽고 값을 디코드하고 "실제"값을 제공해야합니다. 도전 과제는 대다수의 XML을 사람이 읽을 수 있도록 만들어서 실제로 해독 할 필요가 없다는 것입니다. –

관련 문제