我目前正在使用OData v3,但这似乎也在OData v4中失败(只是不同)。
我们说我有以下的Uri:
http://myurl.com/odata/SomeEndpoint?$ filter = FieldId eq 1& $ top = 10
完美,输入Postman或浏览器,效果很好。但如果我对Uri进行编码就会失败。
HTML编码:
http://myurl.com/odata/SomeEndpoint?$ filter = FieldId eq 1& amp; $ top = 10
转义字符之前的所有内容都将应用于查询(因此$ filter仍然有效),但转义字符后的所有内容都会被忽略($ top不会应用)。
URI编码(我试过两个):
http://myurl.com/odata/SomeEndpoint?$ filter = FieldId eq 1%26 $ top = 10
http://myurl.com/odata/SomeEndpoint?$ filter = FieldId eq 1%26%$ top = 10
两者都会导致OData在尝试应用具有以下错误的查询选项时抛出异常(由于这是从内存中释义):
'&' is in invalid character in query string.
$filter=FieldId eq 1&$top=10
正如您所看到的,这是不受欢迎的,也是一个问题。如果我的客户在发送请求之前对其Uri进行编码,那么它将无法正常工作。此外,OData在结果中生成的链接也会被编码,例如,下一页链接:
< link rel =" next" HREF =" HTTP://myurl.com/odata/SomeEndpoint $过滤= FieldId%20当量%201&放大器;放大器; $跳过= 1" />
OData似乎并不介意%20(空格)工作正常,但实际上忽略了$ skip,因为如果你只是将其更改为真正的&符号(& amp;) ;)它工作正常。
有没有办法解决这个问题?这似乎是OData的一个问题。
此处参考我是如何映射我的路线的:
#pragma warning disable CS0618 // OData v3 route mapping.
config.Routes.MapODataRoute(
routeName: "odata",
routePrefix: "odata",
model: model);
#pragma warning restore CS0618
我没有做任何习惯。
更新
当我将ACCEPT标头设置为XML时,我得到:
< link rel =" next" HREF =" HTTP://myurl.com/odata/SomeEndpoint $过滤= FieldId%20当量%201&放大器;放大器; $跳过= 1" />
当我将ACCEPT标题设置为JSON时,我得到:
odata.nextLink":" http://webapi.mydlweb.com/api/test/odata/v3/Checks?$ filter = StoreId%20eq%2040& pagesize = 1& $ skip = 1"
根据以下评论,正确生成JSON链接。我可以点击它,它的工作原理是因为&符号没有编码。但是,XML链接会对&符号进行编码,从而导致它无法正常工作。那么在编码XML时这是正常的吗?那么客户如何知道哪些&符号为" unncode"哪个离开编码?例如,如果您在过滤器内部使用&符号(而不是分隔查询字符串),则需要对其进行编码。
更新2: 我想这是XML编码,而且就是这样。
答案 0 :(得分:1)
你无法在一个查询字符串中逃脱&符号,并期望它在查询字符串中表现得像一个未转义的&符号。这与odata没有任何关系,只是普通的查询字符串行为。通过转义它,解析器不会将其解释为键/值对的分隔符,而是将其解释为值中的字面符号。
示例:此Google搜索有效:
https://www.google.com/search?safe=off&q=test
但是,这个没有:
https://www.google.com/search?safe=off%26q=test