2017-09-08 26 views
0

現在OData v3を使用していますが、これはOData v4でも失敗しているようです。UriがアンパサンドをエスケープしたときにODataフィルタオプションが失敗する

のは、私は以下のウリとしましょう:$フィルター
http://myurl.com/odata/SomeEndpointを=フィールド識別子EQ 1 & $トップ= 10

パーフェクト、郵便配達やブラウザにそのを入力し、素晴らしい作品?。しかし、私がウリをエンコードすると失敗します。

HTMLエンコーディング:
http://myurl.com/odata/SomeEndpoint $フィルタ=フィールド識別子EQ 1 &アンペア; $エスケープ文字がクエリに適用されます前に、トップ= 10

すべて(そう$フィルタはまだ動作します)が、後にすべてのもの?エスケープされた文字は無視されます($ topは適用されません)。

URIエンコード(私は両方を試してみました)?
http://myurl.com/odata/SomeEndpoint $フィルター=フィールド識別子当量1%26 $のトップ= 10 http://myurl.com/odata/SomeEndpoint $フィルター=フィールド識別子当量1%26%の$トップ= 10

両方原因次のエラー(これはメモリからあるので、言い換え)とクエリオプションを適用しようとしたときに例外をスローするためのOData:

'&' is in invalid character in query string. 
$filter=FieldId eq 1&$top=10 

をあなたが見ることができるように、これは望ましくないと問題です。私のクライアントがリクエストを送信する前にUriをエンコードすると、それは機能しません。また、その結果でのODataによって生成されたリンクは、例えば、符号化され、次のページへのリンク:

<リンクのrel =「次」のhref = "http://myurl.com/odata/SomeEndpoint?$filter=フィールド識別子%20eq%201 &アンペア; $ = 1"/>

のODataは正常に動作しますが、$スキップが実際にあるため、エスケープアンパサンドに無視され20%(スペース)を気にしていないようです(&アンプをスキップ;)実際のアンパサンド(&)に変更するだけで正常に動作します。

これを修正する方法はありますか?それはODataの問題であるようです。参考のため

ここでは、私は私のルートをマッピングしています方法です:

#pragma warning disable CS0618 // OData v3 route mapping. 
config.Routes.MapODataRoute(
    routeName: "odata", 
    routePrefix: "odata", 
    model: model); 
#pragma warning restore CS0618 

私は何もカスタムをやっていませんよ。私は私が手XMLに私のACCEPTヘッダーを設定

UPDATE
<リンクのrel = "次" のhref = "http://myurl.com/odata/SomeEndpoint?$filter=FieldId% 20eq%201 &アンペア; $ = 1" スキップ/ >を

私はJSONにヘッダをACCEPTに設定すると、私が得る:
odata.nextLink ":" http://webapi.mydlweb.com/api/test/odata/v3/Checks $フィルタ= StoreId%20eq%2040 &ページサイズ= 1を? & $ skip = 1 "

以下のコメントでは、JSONリンクが正しく生成されています。私はそれをクリックすることができ、アンパサンドはエンコードされていないため動作します。ただし、XMLリンクはアンパサンドをエンコードするため、動作しません。 XMLをエンコードするときにそれは普通ですか?クライアントはどのようにしてアンパサンドを「エンコード解除」し、エンコードを残すかをどのように知っていますか?たとえば、アンパサンドをフィルタ内で使用すると(クエリ文字列を区切らないように)、エンコードする必要があります。

更新2: 私はそれがXMLエンコーディングだと思います。それはまさにそれです。

enter image description here

+1

を、それはそうです。アンパサンドをエスケープすることで、パーサにクエリー文字列の区切り文字として解釈せず、リテラル値として解釈させるように指示します。したがって、あなたの例では、アンパサンド(したがってクエリ文字列の要求)を$フィルタの一部としてインクルードしようとしているようです。 –

+0

フィルタはJUST ** $ filter = StoreId eq 40 **でなければなりません。残りの "$ skip"や "pagesize"はフィルタの一部ではなく、他のクエリ文字列です –

答えて

1

あなたは、クエリ文字列にアンパサンドをエスケープして、クエリ文字列でエスケープアンパサンドのように振る舞うことを期待することはできません。これはodataとは何の関係もなく、通常のクエリ文字列の動作と同じです。これをエスケープすることで、パーサはそれをキー/値のペアの区切りとして解釈せず、値のリテラルのアンパサンドとして解釈します。

例:これはGoogle検索が機能:

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

しかし、この1つはない:これは、それがどのように動作するかをあるように一見

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

それは意味がありますが、自動的にXML形式で生成されたリンクはそれらをエンコードします。私の更新を参照してください。 –

+0

「XMLエンコーディングだと思います」と言うと、あなたは正しいです。技術的には、値をデコードして「本当の」値を与えるXMLパーサでXMLを読むべきです。難題は、XMLの大半が人間が読めるように、実際にデコードする必要がないと感じていることです。 –

関連する問題