How to build a Url?
.net, c#
Solution
If you need to ensure that some string coming as user input is valid url you could use the `Uri.TryCreate` method:
Uri uri;
string someUrl = ...
if (!Uri.TryCreate(someUrl, UriKind.Absolute, out uri))
{
// the someUrl string did not contain a valid url
// inform your users about that
}
else
{
var request = WebRequest.Create(uri);
// ... safely proceed with executing the request
}
Now if on the other hand you want to be building urls in .NET there's the `UriBuilder` class specifically designed for that purpose. Let's take an example. Suppose you wanted to build the following url: `http://example.com/path?foo=bar&baz=bazinga#some_fragment` where the `bar` and `bazinga` values are coming from the user:
string foo = ... coming from user input
string baz = ... coming from user input
var uriBuilder = new UriBuilder("http://example.com/path");
var parameters = HttpUtility.ParseQueryString(string.Empty);
parameters["foo"] = foo;
parameters["baz"] = baz;
uriBuilder.Query = parameters.ToString();
uriBuilder.Fragment = "some_fragment";
Uri finalUrl = uriBuilder.Uri;
var request = WebRequest.Create(finalUrl);
... safely proceed with executing the request
Problem
Are there any helper classes available in .NET to allow me to build a Url? For example, if a user enters a string: ``` stackoverflow.com ``` and i try to pass that to an `HttpWebRequest`: ``` WebRequest.CreateHttp(url); ``` It will fail, because it is not a valid url (it has no prefix). What i want is to be able to parse the partial url the user entered: ``` Uri uri = new Uri(url); ``` and then fix the missing pieces: ``` if (uri.Port == 0) uri.Port = 3333; if (uri.Scheme == "") uri.Scheme = "https"; ``` Does .NET have any classes that can be used to parse and manipulate Uri's? The UriBuilder class can't do the job The value that the user entered (e.g. `stackoverflow.com:3333`) is valid; i just need a class to pick it apart. i tried using the `UriBuilder` class: ``` UriBuilder uriBuilder = new UriBuilder("stackoverflow.com:3333"); ``` unfortunately, the UriBuilder class is unable to handle URIs: - uriBuilder.Path = `3333` - uriBuilder.Port = `-1` - uriBuidler.Scheme = `stackoverflow.com` So i need a class that can understand `host:port`, which especially becomes important when it's not particularly `http`, but could be. Bonus Chatter Console application. From the other question Some examples of URL's that require parsing: - `server:8088` - `server:8088/func1` - `server:8088/func1/SubFunc1` - `http://server` - `http://server/func1` - `http://server/func/SubFunc1` - `http://server:8088` - `http://server:8088/func1` - `http://server:8088/func1/SubFunc1` - `magnet://server` - `magnet://server/func1` - `magnet://server/func/SubFunc1` - `magnet://server:8088` - `magnet://server:8088/func1` - `magnet://server:8088/func1/SubFunc1` - `http://[2001:db8::1]` - `http://[2001:db8::1]:80` The format of a Url is: ``` foo://example.com:8042/over/there?name=ferret#nose \_/ \_________/ \__/\_________/\__________/ \__/ | | | | | | scheme host port path query fragment ``` Bonus Chatter Just to point out again that UriBuilder does not work: - https://dotnetfiddle.net/s66kdZ