Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining URIs and Paths

I am retro-fitting an application to make use of a PHP HTTP proxy (for caching) instead of the actual API server, the application currently combines the server URI and the path with the code:

methodUri = new Uri(apiUri, method.Path)

Where:

  • apiUri = "http://api.eve-online.com/" (System.Uri Object)
  • method.Path = "/char/SkillIntraining.xml.aspx" (string)

The result of the above statement is

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

To use the PHP HTTP proxy the request would have to be changed as follows

  • apiUri = "http://www.r-s.co.uk/eproxy.php" (System.Uri Object)
  • method.Path = "/char/SkillIntraining.xml.aspx" (string)

The output I was expecting was:

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

However the output I get is:

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

I understand that this is the correct functionality of the constructor Uri(Uri, string), my question is what would be a better function or constructor to use in its place to get the output I expect? I have tried removing the leading "/" in method.Path taking it from an absolute path to a relative path however that did not help.

NOTE: both solutions below do work, however System.UriBuilder provides a more robust mechanism for combining URI's and paths and in my case resulted in fewer changes to resources than using System.Uri. Had I the choice I would mark both answers as correct.

like image 993
Richard Slater Avatar asked Mar 24 '09 20:03

Richard Slater


People also ask

How do I combine two URLs?

Combining multiple parts of a URL could be a little bit tricky. You can use the two-parameter constructor Uri(baseUri, relativeUri) , or you can use the Uri. TryCreate() utility function.

Why we use Path combine?

Using Path. Combine() will help prevent you from missing a \ or having two \\ by mistake.


2 Answers

Don't use the Uri object, use a UriBuilder - it copes way better with missing slashes

So

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());

works as expected and produces http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

like image 177
blowdart Avatar answered Sep 28 '22 18:09

blowdart


Add a trailing "/" to apiUri, and remove the leading "/" from 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());

Will print:

http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx
like image 10
Jim Mischel Avatar answered Sep 30 '22 18:09

Jim Mischel