您应该如何构建 OData URI?
How should you build an OData URI?
我正在寻找构建 URI,例如 https://example.com/data/customers?$top=100
。
是否有用于创建 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 特殊字符 $
被编码为在 URI 中用作 %24
。
我在 GitHub 上找到了 OData.Net,它似乎是一个对此类事情很有帮助的库,但它不是标准库的一部分,而且对于我的简单需求来说看起来很重量级,所以我希望在致力于 OData.Net 路径之前找到更简单的东西...
当然,我可以通过做一个简单的 var uri = string.Join("/", new [] {rootUri, apiPath, entity, $"?$top={pageSize}"});
...框架已经给了我。
注意:我知道您可以从 OData 服务生成 类,但我不想使用这种方法,因为如果 API已更改(例如,新字段已添加到目标实体)。相反,我想使用更多 "pure" HTTP 方法。
我找到了解决办法;我不需要特别的 ODataUriBuilder
;相反,我在使用 query.ToString()
时出现了错误,如下所述:
对上述代码应用该修复解决了问题:
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);
我正在寻找构建 URI,例如 https://example.com/data/customers?$top=100
。
是否有用于创建 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 特殊字符 $
被编码为在 URI 中用作 %24
。
我在 GitHub 上找到了 OData.Net,它似乎是一个对此类事情很有帮助的库,但它不是标准库的一部分,而且对于我的简单需求来说看起来很重量级,所以我希望在致力于 OData.Net 路径之前找到更简单的东西...
当然,我可以通过做一个简单的 var uri = string.Join("/", new [] {rootUri, apiPath, entity, $"?$top={pageSize}"});
...框架已经给了我。
注意:我知道您可以从 OData 服务生成 类,但我不想使用这种方法,因为如果 API已更改(例如,新字段已添加到目标实体)。相反,我想使用更多 "pure" HTTP 方法。
我找到了解决办法;我不需要特别的 ODataUriBuilder
;相反,我在使用 query.ToString()
时出现了错误,如下所述:
对上述代码应用该修复解决了问题:
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);