Sending a request through HttpClient, you can set the BaseAddress, after the incoming requests directly to the relative address:
1 using(var httpClient = new HttpClinet()) 2 { 3 httpClient.BaseAddress = new Uri("http://localhost:8082"); 4 await httpClient.GetAsync("Users"); // GET http://localhost:8082/Users 5 await httpClient.PutAsync("User/123", xx); // PUT http://localhost:8082/User/123 6 }
But here too there is a pit, that is, whether the incoming Uri "/" at the end or beginning, will make the final address of the requested changes.
To be a test:
1 var baseUri = new Uri("http://localhost:8082/api"); 2 var relativeUri = new Uri("Users", UriKind.Relative); 3 var requestUri = new Uri(baseUri, relativeUri); 4 Console.WriteLine(requestUri); // http://localhost:8082/Users 5 6 var baseUri = new Uri("http://localhost:8082/api/"); 7 var relativeUri = new Uri("Users", UriKind.Relative); 8 var requestUri= new Uri(baseUri , relativeUri); 9 Console.WriteLine(requestUri); // http://localhost:8082/api/Users 10 11 var baseUri = new Uri("http://localhost:8082/api"); 12 var relativeUri = new Uri("/Users", UriKind.Relative); 13 var requestUri= new Uri(baseUri, relativeUri); 14 Console.WriteLine(requestUri); // http://localhost:8082/Users 15 16 var baseUri = new Uri("http://localhost:8082/api/"); 17 var relativeUri = new Uri("/Users", UriKind.Relative); 18 var requestUri= new Uri(baseUri, relativeUri); 19 Console.WriteLine(requestUri); // http://localhost:8082/Users
As can be seen, only baseUri end with "/", and relativeUri does not begin with "/", you will get a complete Uri, the other will be missing "api" this part.
Find official document, you can find instructions ( Uri constructor ):
1, if relativeUri is an absolute address, the address is in the final relativeUri
2, if baseUri section contains a relative, then only reserved "/" at the end opposite portions
3, if relativeUri starts with "/", it will replace all baseUri opposite portions
Subsequently the test conditions described above:
1 var baseUri = new Uri("http://localhost:8082/api"); 2 var relativeUri = new Uri("http://localhost:8082/api2"); 3 var requestUri = new Uri(baseUri, relativeUri); 4 Console.WriteLine(requestUri); // http://localhost:8082/api2 5 6 var baseUri = new Uri("http://localhost:8082/api/test"); 7 var relativeUri = new Uri("Users", UriKind.Relative); 8 var requestUri = new Uri(baseUri, relativeUri); 9 Console.WriteLine(requestUri); // http://localhost:8082/api/Users 10 11 var baseUri = new Uri("http://localhost:8082/api/test/"); 12 var relativeUri = new Uri("Users", UriKind.Relative); 13 var requestUri = new Uri(baseUri, relativeUri); 14 Console.WriteLine(requestUri); // http://localhost:8082/api/test/Users 15 16 var baseUri = new Uri("http://localhost:8082/api/test/"); 17 var relativeUri = new Uri("/Users", UriKind.Relative); 18 var requestUri = new Uri(baseUri, relativeUri); 19 Console.WriteLine(requestUri); // http://localhost:8082/Users 20 21 var baseUri = new Uri("http://localhost:8082/api/test/"); 22 var relativeUri = new Uri("/User/123/", UriKind.Relative); 23 var requestUri = new Uri(baseUri, relativeUri); 24 Console.WriteLine(requestUri); // http://localhost:8082/User/123/
The results are clear, the final priority Uri depends relativeUri, followed depending baseUri.
However, if only baseUri or relativeUri, it will press "/" to separate it? Continue to test:
1 var baseUri = new Uri("http://localhost:8082/api/test/"); 2 var relativeUri = new Uri("http://localhost:8082/api2/test"); 3 var requestUri = new Uri(baseUri, relativeUri); 4 Console.WriteLine(requestUri); // http://localhost:8082/api2/test 5 6 var baseUri = new Uri("http://localhost:8082/api/test"); 7 var relativeUri = new Uri("/", UriKind.Relative); 8 var requestUri = new Uri(baseUri, relativeUri); 9 Console.WriteLine(requestUri); // http://localhost:8082/ 10 11 var baseUri = new Uri("http://localhost:8082/api/test"); 12 var relativeUri = new Uri("", UriKind.Relative); 13 var requestUri = new Uri(baseUri, relativeUri); 14 Console.WriteLine(requestUri); // http://localhost:8082/api2/test 15 16 var relativeUri = new Uri("/api/Users", UriKind.Relative); 17 Console.WriteLine(relativeUri); // /api/Users
Therefore, according to the test results can be added to two rules:
1, if relativeUri is an absolute address, then completely relativeUri, regardless of whether the "/" at the end
2, if only baseUri or relativeUri, then no treatment
In addition, interested can decompile System.dll look Uri object implementation.