c# - 您应该如何构建 OData URI?
问题描述
我正在寻找构建 URI,例如https://example.com/data/customers?$top=100
.
是否有UriBuilder
用于创建 OData URI(即可以$
适当地处理字符等)?
完整信息
我有这样的代码(简化示例):
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}"});
......但我想确保我正在利用 .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);
推荐阅读
- c# - 连接 SQL Server 数据库中的查询和 C# 中的 DBF
- reactjs - typescript:在没有默认值的情况下键入可选的更好方法?
- kubernetes - 使用 Kustomize/Kubernetes 中的 Generator 创建的 ConfigMap
- django-views - 在 Django 中接收多条错误消息
- java - 正确读取 gzip 文件
- java - 如何修复 Android Studio 区块链应用程序中的声明
- terraform - AWS EKS terraform tutorial (with assumeRole) - k8s dashboard error
- node.js - nestjs mongoose 自引用子文档模型类型错误
- javascript - 滚动时更改 div 显示
- css - Big Cartel,使用 Web 服务器托管自定义字体不起作用