我希望构建像https://example.com/data/customers?$top=100
这样的URI。
是否有用于创建OData URI的UriBuilder
(即可以适当地处理$
等字符(?
完整信息
我有这样的代码(简化示例(:
public Uri CreateMyApiUri(string rootUri, string apiPath, string entity, int pageSize)
{
var builder = new UriBuilder(rootUri);
builder.Path = ConcatPathParts(builder.Path, apiPath, entity); //basically string.Join("/", args), plus code to remove superfluous slashes
var parameters = HttpUtility.ParseQueryString(builder.Query);
if (pageSize > 0) parameters["$top"] = pageSize.ToString();
builder.Query = parameters.ToString();
return builder.Uri;
}
//called like this
var uri = CreateMyApiUri("https://example.com", "data", "customers", 100);
但是,OData特殊字符$
被编码为%24
,以便在URI中使用。
我在GitHub上找到了OData.Net,它似乎是一个很有帮助的库,但它不是标准库的一部分,对于我的简单需求来说,它看起来很重要,所以我希望在致力于OData.Net之前找到一些更简单的东西。。。
当然,我可以通过做一个简单的var uri = string.Join("/", new [] {rootUri, apiPath, entity, $"?$top={pageSize}"});
来避免这种情况。。。但我想确保我正在利用.net库的字符转义功能,而不是为框架已经提供的东西创建解决方案。
注意:我知道您可以从OData服务生成类,但我不想使用这种方法,因为如果API发生更改(例如,向目标实体添加新字段(,则需要重新生成客户端代码。相反,我想使用一种更"纯粹"的HTTP方法。
我找到了一个解决方案;我不需要特殊的ODataUriBuilder
;相反,我在使用query.ToString()
时出现了一个错误,如下所述:https://stackoverflow.com/a/26789977/361842
将该修复程序应用于上述代码解决了问题:
public Uri CreateMyApiUri(string rootUri, string apiPath, string entity, int pageSize)
{
var builder = new UriBuilder(rootUri);
builder.Path = ConcatPathParts(builder.Path, apiPath, entity); //basically string.Join("/", args), plus code to remove superfluous slashes
var parameters = HttpUtility.ParseQueryString(builder.Query);
if (pageSize > 0) parameters["$top"] = pageSize.ToString();
//the fix:
builder.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(parameters.ToString()));
//instead of:
//builder.Query = parameters.ToString();
return builder.Uri;
}
//called like this
var uri = CreateMyApiUri("https://example.com", "data", "customers", 100);