【问题标题】:Combining URIs and Paths组合 URI 和路径
【发布时间】:2009-03-24 20:42:19
【问题描述】:

我正在改造一个应用程序以使用 PHP HTTP 代理(用于缓存)而不是实际的 API 服务器,该应用程序当前将服务器 URI 和路径与代码结合起来:

methodUri = new Uri(apiUri, method.Path)

地点:

上面语句的结果是

"http://api.eve-online.com/char/SkillIntraining.xml.aspx" (System.Uri Object)

要使用 PHP HTTP 代理,必须将请求更改如下

我期待的输出是:

"http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx" (System.Uri Object)

但是我得到的输出是:

"http://www.r-s.co.uk/char/SkillIntraining.xml.aspx" (System.Uri Object)

我知道这是构造函数 Uri(Uri, string) 的正确功能,我的问题是什么是更好的函数或构造函数来代替它来获得我期望的输出?我尝试删除 method.Path 中的前导“/”,将其从绝对路径转换为相对路径,但这没有帮助。

注意: 以下两种解决方案都可以工作,但是 System.UriBuilder 提供了一种更强大的机制来组合 URI 和路径,在我的例子中,对资源的更改比使用 System.Uri。如果我可以选择,我会将两个答案都标记为正确。

【问题讨论】:

    标签: c# .net web-services


    【解决方案1】:

    不要使用 Uri 对象,使用 UriBuilder - 它可以更好地处理缺少斜杠的情况

    所以

    Uri apiUri = new Uri("http://www.r-s.co.uk/eproxy.php");
    string methodPath = "/char/SkillIntraining.xml.aspx";
    
    System.UriBuilder uriBuilder = new System.UriBuilder(apiUri);
    uriBuilder.Path += methodPath;
    
    Console.WriteLine(uriBuilder.Uri.ToString());
    

    按预期工作并产生http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

    【讨论】:

    • 你是对的 System.UriBuilder 是一种更强大的构建 URI 的方法,谢谢。
    • 请注意,路径将被 URL 编码,因此如果添加包含查询字符串?和 & 字符将被编码。这是所描述的这种方法的一个弱点。
    • UriBuilder 具有用于查询字符串的单独 Query 属性,建议使用该属性,因为它可以正确处理该用例的字符编码。
    • 没错,我已经养成了解析 UriBuilder.Query,添加查询参数,然后将构建器查询设置为与构建的 NameValueCollection 相等的习惯。
    【解决方案2】:

    在 apiUri 中添加尾随“/”,并从 method.Path 中删除前导“/”:

    Uri apiUri = new Uri("http://www.r-s.co.uk/eproxy.php/");
    string path = "char/SkillIntraining.xml.aspx";
    Uri uri = new Uri(apiUri, path);
    Console.WriteLine(uri.ToString());
    

    将打印:

    http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx
    

    【讨论】:

    • 难道没有一个工具可以解决从一侧或另一侧添加和减去“/”的问题吗?
    • 如果你把前导斜杠放在你要添加的位上,Uri 构造函数认为它是相对于基数的,所以你得到“base.com/bit-you-are-adding.html”,如果你去掉前导斜杠它假设它是相对于原始 Uri 的,给你“base.com/OriginalUri/bit-you-are-adding.html
    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2021-02-10
    相关资源
    最近更新 更多