[C#] 文字列をURLとして扱えるUriクラスの使い方を解説

C#のUriクラスは、文字列をURLとして扱うためのクラスです。

Uriオブジェクトを作成することで、URLの解析や操作が簡単に行えます。

UriクラスのコンストラクタにURL文字列を渡すことでインスタンスを生成できます。

例えば、new Uri("https://example.com")のように使用します。

Uriクラスは、プロトコルScheme、ホストHost、パスAbsolutePathなどのプロパティを提供し、URLの各部分にアクセスできます。

この記事でわかること
  • Uriクラスの基本的な使い方
  • URLの各部分の取得方法
  • URLの結合や正規化の手法
  • Webリクエストでの活用例
  • URLのバリデーションの方法

目次から探す

Uriクラスとは

Uriクラスは、C#においてURL(Uniform Resource Identifier)を扱うための強力なクラスです。

このクラスは、URLの構成要素を簡単に解析、操作、検証するためのメソッドやプロパティを提供します。

Uriクラスを使用することで、スキーム(http、httpsなど)、ホスト名、ポート番号、パス、クエリ文字列、フラグメントなど、URLの各部分にアクセスしやすくなります。

特に、WebアプリケーションやAPIの開発において、URLの操作は非常に重要です。

Uriクラスを利用することで、相対URLと絶対URLの変換、URLの結合、バリデーションなどが容易に行えます。

これにより、開発者はより効率的にURLを管理し、エラーを減らすことができます。

C#のUriクラスは、URLを扱う際の標準的なツールとして広く利用されています。

Uriクラスの基本的な使い方

Uriオブジェクトの生成

Uriオブジェクトは、URL文字列を引数にして生成します。

以下のように、Uriクラスのコンストラクタを使用して簡単にオブジェクトを作成できます。

using System;
class Program
{
    static void Main()
    {
        // Uriオブジェクトを生成
        Uri uri = new Uri("https://www.example.com:8080/path?query=123#fragment");
        
        // Uriの情報を表示
        Console.WriteLine(uri);
    }
}
https://www.example.com:8080/path?query=123#fragment

相対URIと絶対URIの違い

  • 絶対URI: 完全なURLで、スキーム、ホスト名、パスなどを含む。

例: https://www.example.com/path

  • 相対URI: 基準となるURIに対して相対的に指定されるURL。

例: /path(基準URIに基づいて解決される)

相対URIは、特定のコンテキスト内でのみ意味を持ち、絶対URIは常に一意にリソースを指し示します。

Uriクラスのプロパティ

Uriクラスには、URLの各部分にアクセスするための多くのプロパティがあります。

以下に主要なプロパティを示します。

スクロールできます
プロパティ名説明
SchemeURLのスキーム(http、httpsなど)
Hostホスト名(例: www.example.com)
Portポート番号(例: 8080)
AbsolutePathURLの絶対パス(例: /path)
Queryクエリ文字列(例: ?query=123)
Fragmentフラグメント(例: #fragment)

Scheme(スキーム)

スキームは、URLの最初の部分で、リソースにアクセスするためのプロトコルを示します。

例えば、httphttpsなどがあります。

Host(ホスト)

ホストは、リソースが存在するサーバーのドメイン名またはIPアドレスを示します。

例: www.example.com

Port(ポート)

ポートは、サーバー上でリソースにアクセスするための特定のエンドポイントを示します。

デフォルトのポート(httpは80、httpsは443)以外を指定する場合に使用されます。

AbsolutePath(絶対パス)

絶対パスは、リソースの位置を示すパスで、ホスト名の後に続きます。

例: /path/to/resource

Query(クエリ)

クエリは、URLの一部で、リソースに対する追加の情報を提供します。

通常、?の後に続き、key=valueの形式で指定されます。

Fragment(フラグメント)

フラグメントは、URLの一部で、特定のリソース内の位置を示します。

#の後に続く部分がフラグメントです。

例: #section1

Uriクラスのメソッド

Uriクラスには、URLを操作するための便利なメソッドが多数用意されています。

以下に主要なメソッドを紹介します。

IsWellFormedUriStringメソッド

このメソッドは、指定された文字列が正しい形式のURIであるかどうかを検証します。

戻り値は、URIが正しい場合はtrue、そうでない場合はfalseです。

using System;
class Program
{
    static void Main()
    {
        string uriString = "https://www.example.com";
        
        // URIの形式を検証
        bool isValid = Uri.IsWellFormedUriString(uriString, UriKind.Absolute);
        
        Console.WriteLine(isValid); // 出力: True
    }
}
True

TryCreateメソッド

TryCreateメソッドは、指定された文字列からUriオブジェクトを生成し、成功したかどうかを示すブール値を返します。

失敗した場合でも例外をスローせず、エラー処理が容易です。

using System;
class Program
{
    static void Main()
    {
        string uriString = "https://www.example.com/path";
        Uri uri;
        
        // Uriオブジェクトを生成
        bool success = Uri.TryCreate(uriString, UriKind.Absolute, out uri);
        
        Console.WriteLine(success); // 出力: True
        Console.WriteLine(uri);      // 出力: https://www.example.com/path
    }
}
True
https://www.example.com/path

MakeRelativeUriメソッド

MakeRelativeUriメソッドは、基準となるURIから指定されたURIへの相対URIを生成します。

これにより、絶対URIを相対URIに変換できます。

using System;
class Program
{
    static void Main()
    {
        Uri baseUri = new Uri("https://www.example.com/path/");
        Uri targetUri = new Uri("https://www.example.com/path/resource");
        
        // 相対URIを生成
        Uri relativeUri = baseUri.MakeRelativeUri(targetUri);
        
        Console.WriteLine(relativeUri); // 出力: resource
    }
}
resource

Combineメソッド

Combineメソッドは、基準となるURIと相対URIを結合して新しいURIを生成します。

これにより、相対パスを持つURIを簡単に作成できます。

using System;
class Program
{
    static void Main()
    {
        Uri baseUri = new Uri("https://www.example.com/");
        string relativePath = "path/resource";
        
        // URIを結合
        Uri combinedUri = new Uri(baseUri, relativePath);
        
        Console.WriteLine(combinedUri); // 出力: https://www.example.com/path/resource
    }
}
https://www.example.com/path/resource

GetLeftPartメソッド

GetLeftPartメソッドは、URIの指定された部分(スキーム、ホスト、ポートなど)を取得します。

引数には、取得したい部分の種類を指定します。

using System;
class Program
{
    static void Main()
    {
        Uri uri = new Uri("https://www.example.com:8080/path?query=123#fragment");
        
        // スキームとホストを取得
        string leftPart = uri.GetLeftPart(UriPartial.Authority);
        
        Console.WriteLine(leftPart); // 出力: https://www.example.com:8080
    }
}
https://www.example.com:8080

Equalsメソッド

Equalsメソッドは、2つのUriオブジェクトが同じかどうかを比較します。

URIが同じであればtrueを返し、異なればfalseを返します。

using System;
class Program
{
    static void Main()
    {
        Uri uri1 = new Uri("https://www.example.com/path");
        Uri uri2 = new Uri("https://www.example.com/path");
        
        // URIの比較
        bool areEqual = uri1.Equals(uri2);
        
        Console.WriteLine(areEqual); // 出力: True
    }
}
True

Uriクラスのプロパティを使ったURL解析

Uriクラスのプロパティを使用することで、URLの各部分を簡単に取得し、解析することができます。

以下に、具体的なプロパティの使用例を示します。

URLのスキームを取得する

スキームは、URLが使用するプロトコルを示します。

UriクラスSchemeプロパティを使用して、スキームを取得できます。

using System;
class Program
{
    static void Main()
    {
        Uri uri = new Uri("https://www.example.com/path?query=123#fragment");
        
        // スキームを取得
        string scheme = uri.Scheme;
        
        Console.WriteLine(scheme); // 出力: https
    }
}
https

ホスト名を取得する

ホスト名は、リソースが存在するサーバーのドメイン名またはIPアドレスを示します。

Hostプロパティを使用して、ホスト名を取得できます。

using System;
class Program
{
    static void Main()
    {
        Uri uri = new Uri("https://www.example.com/path?query=123#fragment");
        
        // ホスト名を取得
        string host = uri.Host;
        
        Console.WriteLine(host); // 出力: www.example.com
    }
}
www.example.com

ポート番号を取得する

ポート番号は、サーバー上でリソースにアクセスするための特定のエンドポイントを示します。

Portプロパティを使用して、ポート番号を取得できます。

using System;
class Program
{
    static void Main()
    {
        Uri uri = new Uri("https://www.example.com:8080/path?query=123#fragment");
        
        // ポート番号を取得
        int port = uri.Port;
        
        Console.WriteLine(port); // 出力: 8080
    }
}
8080

パスやクエリを取得する

AbsolutePathプロパティを使用して、URLの絶対パスを取得できます。

また、Queryプロパティを使用して、クエリ文字列を取得できます。

using System;
class Program
{
    static void Main()
    {
        Uri uri = new Uri("https://www.example.com/path/resource?query=123#fragment");
        
        // 絶対パスを取得
        string absolutePath = uri.AbsolutePath;
        
        // クエリを取得
        string query = uri.Query;
        
        Console.WriteLine(absolutePath); // 出力: /path/resource
        Console.WriteLine(query);         // 出力: ?query=123
    }
}
/path/resource
?query=123

Uriクラスを使ったURLの操作

Uriクラスを使用することで、URLの操作が簡単に行えます。

以下に、具体的な操作方法を示します。

URLの結合

URLの結合は、基準となるURIと相対URIを組み合わせて新しいURIを生成する操作です。

Uriクラスのコンストラクタを使用して、簡単に結合できます。

using System;
class Program
{
    static void Main()
    {
        Uri baseUri = new Uri("https://www.example.com/");
        string relativePath = "path/resource";
        
        // URLを結合
        Uri combinedUri = new Uri(baseUri, relativePath);
        
        Console.WriteLine(combinedUri); // 出力: https://www.example.com/path/resource
    }
}
https://www.example.com/path/resource

相対URLから絶対URLを生成する

相対URLを基準となるURIに対して解決することで、絶対URLを生成できます。

Uriクラスのコンストラクタを使用して、相対URLを絶対URLに変換します。

using System;
class Program
{
    static void Main()
    {
        Uri baseUri = new Uri("https://www.example.com/path/");
        string relativeUri = "resource";
        
        // 相対URLから絶対URLを生成
        Uri absoluteUri = new Uri(baseUri, relativeUri);
        
        Console.WriteLine(absoluteUri); // 出力: https://www.example.com/path/resource
    }
}
https://www.example.com/path/resource

クエリパラメータの追加・変更

クエリパラメータを追加または変更するには、元のURIを基に新しいURIを生成する必要があります。

以下の例では、クエリパラメータを追加しています。

using System;
using System.Web;
class Program
{
    static void Main()
    {
        Uri baseUri = new Uri("https://www.example.com/path/resource?query=123");
        
        // クエリパラメータを追加
        var uriBuilder = new UriBuilder(baseUri);
        var query = HttpUtility.ParseQueryString(uriBuilder.Query);
        query["newParam"] = "456"; // 新しいクエリパラメータを追加
        uriBuilder.Query = query.ToString();
        
        Console.WriteLine(uriBuilder.Uri); // 出力: https://www.example.com/path/resource?query=123&newParam=456
    }
}
https://www.example.com/path/resource?query=123&newParam=456

URLの正規化

URLの正規化は、同じリソースを指す異なる形式のURLを統一する操作です。

Uriクラスを使用して、正規化されたURLを取得できます。

using System;
class Program
{
    static void Main()
    {
        Uri uri = new Uri("https://www.example.com:80/path/../resource");
        
        // URLの正規化
        Uri normalizedUri = new Uri(uri.GetLeftPart(UriPartial.Path));
        
        Console.WriteLine(normalizedUri); // 出力: https://www.example.com/path/resource
    }
}
https://www.example.com/path/resource

Uriクラスの応用例

Uriクラスは、さまざまな場面で活用される強力なツールです。

以下に、具体的な応用例を示します。

WebリクエストでのUriクラスの利用

Webリクエストを行う際に、Uriクラスを使用してURLを構築し、HttpClientなどのクラスと組み合わせてリクエストを送信できます。

using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
    static async Task Main()
    {
        Uri uri = new Uri("https://api.example.com/data");
        
        using (HttpClient client = new HttpClient())
        {
            // GETリクエストを送信
            HttpResponseMessage response = await client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                string content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content); // レスポンスの内容を表示
            }
        }
    }
}

APIエンドポイントの管理

APIエンドポイントを管理する際に、Uriクラスを使用してエンドポイントの構築や変更を行うことができます。

これにより、エンドポイントの変更が容易になります。

using System;
class Program
{
    static void Main()
    {
        Uri baseUri = new Uri("https://api.example.com/");
        string endpoint = "users/123";
        
        // APIエンドポイントを構築
        Uri apiEndpoint = new Uri(baseUri, endpoint);
        
        Console.WriteLine(apiEndpoint); // 出力: https://api.example.com/users/123
    }
}
https://api.example.com/users/123

URLのバリデーション

Uriクラスを使用して、URLが正しい形式であるかどうかを検証できます。

これにより、無効なURLを事前にチェックすることができます。

using System;
class Program
{
    static void Main()
    {
        string url = "https://www.example.com";
        
        // URLの形式を検証
        bool isValid = Uri.IsWellFormedUriString(url, UriKind.Absolute);
        
        Console.WriteLine(isValid); // 出力: True
    }
}
True

URLのリダイレクト処理

リダイレクト処理を行う際に、Uriクラスを使用して新しいURLを取得し、適切にリダイレクトを処理することができます。

using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
    static async Task Main()
    {
        Uri initialUri = new Uri("https://www.example.com/old-path");
        
        using (HttpClient client = new HttpClient())
        {
            // GETリクエストを送信
            HttpResponseMessage response = await client.GetAsync(initialUri);
            if (response.StatusCode == System.Net.HttpStatusCode.MovedPermanently)
            {
                // リダイレクト先のURIを取得
                Uri redirectUri = response.Headers.Location;
                Console.WriteLine($"リダイレクト先: {redirectUri}");
            }
        }
    }
}
リダイレクト先: https://www.example.com/new-path

よくある質問

Uriクラスと文字列の違いは何ですか?

Uriクラスは、URLを扱うための特別なクラスであり、URLの構成要素(スキーム、ホスト、パス、クエリなど)に簡単にアクセスできるように設計されています。

一方、文字列は単なるデータの集合であり、URLの構成要素を直接操作するための機能はありません。

Uriクラスを使用することで、URLの解析や操作が容易になり、エラーを減らすことができます。

相対URLと絶対URLの違いは何ですか?

相対URLは、基準となるURLに対して相対的に指定されるURLであり、特定のコンテキスト内でのみ意味を持ちます。

例えば、/pathという相対URLは、基準URLに基づいて解決されます。

一方、絶対URLは、完全なURLであり、スキーム、ホスト名、パスなどを含むため、常に一意にリソースを指し示します。

例として、https://www.example.com/pathが絶対URLです。

UriクラスでURLのバリデーションは可能ですか?

はい、UriクラスではURLのバリデーションが可能です。

Uri.IsWellFormedUriStringメソッドを使用することで、指定された文字列が正しい形式のURIであるかどうかを検証できます。

このメソッドは、URIが正しい場合はtrueを返し、そうでない場合はfalseを返します。

これにより、無効なURLを事前にチェックすることができます。

まとめ

この記事では、C#のUriクラスを使用してURLを効果的に操作する方法について詳しく解説しました。

Uriクラスの基本的な使い方から、URLの結合、相対URLの生成、クエリパラメータの追加、正規化、さらにはWebリクエストやAPIエンドポイントの管理に至るまで、さまざまな応用例を紹介しました。

これらの知識を活用することで、URLの操作がより効率的に行えるようになるでしょう。

今後は、実際のプロジェクトでUriクラスを積極的に利用し、URLの管理や操作をスムーズに行ってみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す