代码之家  ›  专栏  ›  技术社区  ›  JohnLBevan

您应该如何构建OData URI?

  •  4
  • JohnLBevan  · 技术社区  · 6 年前

    我想建立这样的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 .

    我找到了 OData.Net 在Github上,这似乎是一个有帮助的库,但它不是标准库的一部分,对于我的简单需求,它看起来相当重要,所以我希望在提交到odata.net路径之前找到更简单的东西…

    当然,我可以通过做一个简单的 var uri = string.Join("/", new [] {rootUri, apiPath, entity, $"?$top={pageSize}"}); …但我想确保我充分利用了.NET库的字符转义功能,而不是为框架已经提供给我的东西创建解决方案。

    注意:我知道您可以从OData服务生成类,但我不想使用这种方法,因为这需要在API更改时重新生成客户机代码(例如,向目标实体添加新字段)。相反,我希望使用更“纯”的HTTP方法。

    1 回复  |  直到 6 年前
        1
  •  0
  •   JohnLBevan    6 年前

    我找到了解决办法;我不需要特别的 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);
    
    推荐文章