合并URI和路径

23
我正在改进一个应用程序,以使用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,它导致的资源更改较少。如果我可以选择的话,我会将两个答案都标记为正确。
2个回答

44

不要使用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更健壮的方式,谢谢。 - Richard Slater
2
请注意,路径将进行URL编码,因此如果添加包含查询字符串,则“?”和“&”字符将被编码。正如所述,这种方法存在弱点。 - JT.
UriBuilder有一个单独的查询属性用于查询字符串,这是推荐的,因为它可以正确处理该用例的字符编码。 - Christopher Currie
1
没错,我已经习惯解析UriBuilder.Query,添加查询参数,然后将构建的NameValueCollection设置为构建器查询。 - Ben Sewards

10

在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

3
有没有一种工具可以解决这个问题,避免在一侧或另一侧添加和减去“/”? - Marty
如果在你添加的位上放置前导斜杠,Uri构造函数会认为它相对于基础部分,因此你会得到"http://www.base.com/bit-you-are-adding.html"。如果省略前导斜杠,则它会假定相对于原始Uri,从而给出"http://www.base.com/OriginalUri/bit-you-are-adding.html"。 - galamdring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接