Go の net/url パッケージを使用して URL を操作する

Go の net/url パッケージを使用して URL を操作する

URL (Uniform Resource Locator) は、インターネットで最も重要なインフラストラクチャの 1 つです。Web アプリケーションを構築するときは、URL を操作してリソースを見つけて取得する必要があります。

より洗練された Web アプリを構築するときは、より細かいレベルで URL を操作する必要があります。スキーム、ホスト名、パス、およびクエリ パラメータを特定する必要がある場合があります。また、特殊文字を処理して Web アプリケーションを安全に保つために、URL をエンコードおよびデコードする方法も知っておく必要があります。

Go の標準ライブラリは、URL と URL コンポーネントを処理する net/url パッケージを提供します。

URL パッケージ

urlパッケージは、URL とその個別の部分を操作するための包括的な関数と機能を提供します。URL を解析、構築、エンコード、およびデコードするための関数を提供するため、このパッケージは Web 開発に役立ちます。

urlパッケージの重要な機能のいくつかは、HTTP 要求の操作と URL 構築のために URL を個々のコンポーネントに解析する機能です。urlパッケージは、文字列を URL に解析するための Parse メソッドを含むURL構造提供します。

url.URL構造体モデルは次のとおりです。

package main

type URL struct {
    // Scheme is the protocol scheme of the URL,
    // such as "http"or "https"
    Scheme string

    // Opaque is used to hold any opaque data
    // that should be encoded in the URL
    Opaque string

    // User holds information about the user making the request,
    // such as a username and password
    User *Userinfo

    // Host is the hostname or IP address
    // of the server hosting the URL
    Host string

    // Path is the path of the URL on the server
    Path string

    // RawPath is the original,
    // encoded path of the URL
    RawPath string

    // ForceQuery indicates whether the URL should include a query string
    // even if it is empty
    ForceQuery bool

    // RawQuery is the original,
    //encoded query string of the URL
    RawQuery string

    // Fragment is the fragment identifier of the URL,
    // used for linking to a specific element on a page
    Fragment string

    // RawFragment is the original,
    // encoded fragment identifier of the URL
    RawFragment string
}

URL構造体のさまざまな部分にアクセスする方法を知っていると、検証などのタスクに役立ちます。

解析関数を使用した URL の解析

urlパッケージの解析機能は、URL 文字列を個々のコンポーネントに解析する機能を提供します。Parse関数は単一の URL を引数として取り、URL の解析済みデータとエラー タイプを含む url.URL 構造体へのポインターを返します

Parse関数を使用して URL の要素を取得する方法を次に示します。

import (
    "fmt"
    "net/url"
)

func main() {
    // The URL you want to parse
    exampleURL: = "https://www.example.com/path?param1=value1&param2=value2"

    // Parse the URL
    parsedURL, err: = url.Parse(exampleURL)

    if err! = nil {
        fmt.Println(err)
        return
    }

    // Print all the fields of the URL
    fmt.Println("Scheme:", parsedURL.Scheme)
    fmt.Println("Opaque:", parsedURL.Opaque)
    fmt.Println("User:", parsedURL.User)
    fmt.Println("Host:", parsedURL.Host)
    fmt.Println("Path:", parsedURL.Path)
    fmt.Println("RawPath:", parsedURL.RawPath)
    fmt.Println("ForceQuery:", parsedURL.ForceQuery)
    fmt.Println("RawQuery:", parsedURL.RawQuery)
    fmt.Println("Fragment:", parsedURL.Fragment)
    fmt.Println("RawFragment:", parsedURL.RawFragment)
}

exampleURL変数は解析されていない完全な URL を保持し、Parse関数はexampleURL変数の内容を解析し、解析された URL を返します。プログラムは、Printlnへの一連の呼び出しで終了し、 URL構造体の個々のフィールドを示します。

サンプル URL の url.URL 構造体インスタンスの結果

parse 関数は、URL が実際に存在する実際の URL であるかどうかをチェックしません。URL を構文的に解析するだけです。httpパッケージを使用して、URL に GET リクエストを送信し、レスポンスを確認できます。

import (
    "fmt"
    "net/http"
)

func main() {
    // The URL you want to check
    exampleURL: = "https://www.example.com"

    // Make an HTTP GET request to the URL
    response, err: = http.Get(exampleURL)

    if err! = nil {
        fmt.Println(err)
        return
    }

    defer response.Body.Close()

    // Check the response status code
    if response.StatusCode == http.StatusOK {
        fmt.Println("URL exists.")
    } else {
        fmt.Println("URL does not exist.")
    }
}

main関数は、httpパッケージのGet関数を使用してexampleURLにGET要求を行います。この関数は、応答インスタンスとエラー タイプを返します。プログラムはifステートメントで終了し、HTTP ステータス コードをhttpパッケージのStatusOk定数と照合して Web サイトの存在を検証します。

このアプローチでは、チェックの結果に基づいて、ユーザーを別のページにリダイレクトする、エラー メッセージを表示する、一定期間後にリクエストを再試行するなどのアクションを実行できます。

URL パラメータのエンコードとデコード

urlパッケージは、URL パラメーターをエンコードするための Encode メソッドを提供しますEncode関数は、URL パラメーター内の特殊文字とスペースをパーセント エンコードします。

import (
    "fmt"
    "net/url"
)

func main() {
    // create a new url.Values struct
    params: = url.Values{}

    // add values to the struct
    params.Add("name", "John Smith")
    params.Add("age", "30")
    params.Add("gender", "male")

    // encode the struct into a string
    encodedParams: = params.Encode()
    fmt.Println(encodedParams)

    // Output: "age=30&gender=male&name=John+Smith"
}

main関数はurlパッケージの新しい Values 構造体インスタンスを作成し、構造体インスタンスのAddメソッドデータキーと値のペアを構造体インスタンスに追加します。

Encodeメソッドは、キーと値のペアを URL 文字列形式「key1=value1&key2=value2&key3=value3」に変換します。

urlパッケージのParseQuery関数を使用して、エンコードされた URL 文字列をデコードできます。

import (
    "fmt"
    "net/url"
)

func main() {
    // encoded string of URL parameters
    encodedParams: = "age=30&gender=male&name=John+Smith"

    // parse the encoded string into a url.Values struct
    params, err: = url.ParseQuery(encodedParams)

    if err! = nil {
        fmt.Println(err)
    }

    // print the struct
    fmt.Println(params)

    // Output: map[age:[30] gender:[male] name:[John Smith]]
}

encodedParameter変数は、エンコードされた URL 文字列ですParseQuery関数は、encodedParameter変数を受け取り、デコードされた URL 文字列とエラーを返します。

これらの Go パッケージは、Web ルーティング ゲームを次のレベルに引き上げます

Web アプリケーションのページに使用する URL は、検索エンジンでのパフォーマンスと可視性に貢献します。Web ルーティングは、着信要求を URL に基づいて適切なハンドラー関数に転送するプロセスです。

http パッケージや、Gorilla Mux、Chi、Pat、Httprouter などの一般的なサードパーティ パッケージを使用してルーティングできます。これらのパッケージは、http パッケージの複雑さの一部を抽象化することで、ルーティングをより簡単にします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です