应该如何构建OData URI



我希望构建像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);

相关内容

  • 没有找到相关文章

最新更新