0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Goのnet/httpパッケージ チートシート

Posted at

Goのnet/httpパッケージ チートシート

Goのnet/httpパッケージに関する詳しいチートシートです。コード例とコメントを含めているので、参考にしてください。

1. 基本的なHTTPサーバー

package main

import (
    "fmt"
    "net/http"
)

// HTTPリクエストを処理するハンドラ関数
func handler(w http.ResponseWriter, r *http.Request) {
    // クライアントにレスポンスを返す
    fmt.Fprintf(w, "こんにちは、あなたはこのURLをリクエストしました: %s
", r.URL.Path)
}

func main() {
    // ルートパス"/"にハンドラ関数を登録
    http.HandleFunc("/", handler)

    // ポート8080でHTTPサーバーを起動
    fmt.Println("ポート8080でサーバーを起動します")
    err := http.ListenAndServe(":8080", nil) // nilはデフォルトのマルチプレクサを使用
    if err != nil {
        fmt.Println("サーバー起動時にエラー:", err)
    }
}

2. 静的ファイルを提供する

package main

import (
    "net/http"
)

func main() {
    // "./static"ディレクトリからファイルを提供
    fs := http.FileServer(http.Dir("./static"))
    http.Handle("/", fs)

    // ポート8080でHTTPサーバーを起動
    http.ListenAndServe(":8080", nil)
}

3. http.ServeMuxによるルーティング

package main

import (
    "fmt"
    "net/http"
)

// ホームページのハンドラ
func homeHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "ホームページへようこそ!")
}

// アバウトページのハンドラ
func aboutHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "アバウトページへようこそ!")
}

func main() {
    // 新しいServeMux(HTTPリクエストマルチプレクサ)を作成
    mux := http.NewServeMux()

    // ルートごとにハンドラを登録
    mux.HandleFunc("/", homeHandler)
    mux.HandleFunc("/about", aboutHandler)

    // ポート8080でHTTPサーバーを起動
    http.ListenAndServe(":8080", mux)
}

4. HTTP GETリクエストを行う

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    // 外部APIに対してHTTP GETリクエストを送信
    resp, err := http.Get("https://api.example.com/data")
    if err != nil {
        fmt.Println("GETリクエスト中にエラー:", err)
        return
    }
    defer resp.Body.Close()

    // レスポンスボディを読み込み、表示
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("レスポンスボディの読み込み中にエラー:", err)
        return
    }

    fmt.Println(string(body))
}

5. HTTP POSTリクエストを行う

package main

import (
    "bytes"
    "fmt"
    "net/http"
)

func main() {
    // POSTリクエストで送信するJSONデータ
    var jsonData = []byte(`{"name": "John", "age": 30}`)

    // JSONデータを使ってPOSTリクエストを作成
    resp, err := http.Post("https://api.example.com/submit", "application/json", bytes.NewBuffer(jsonData))
    if err != nil {
        fmt.Println("POSTリクエスト中にエラー:", err)
        return
    }
    defer resp.Body.Close()

    // レスポンスのステータスを表示
    fmt.Println("レスポンスステータス:", resp.Status)
}

6. カスタムHTTPクライアント

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    // タイムアウトを設定したカスタムHTTPクライアントを作成
    client := &http.Client{
        Timeout: 10 * time.Second, // タイムアウトを10秒に設定
    }

    // カスタムクライアントを使ってGETリクエストを行う
    resp, err := client.Get("https://api.example.com/data")
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }
    defer resp.Body.Close()

    // レスポンスのステータスを表示
    fmt.Println("レスポンスステータス:", resp.Status)
}

7. http.Handlerインターフェースによるカスタムハンドラ

package main

import (
    "fmt"
    "net/http"
)

// カスタムハンドラタイプ
type customHandler struct{}

// http.Handlerインターフェースを満たすためのServeHTTPメソッド
func (h *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "カスタムハンドラからのレスポンスです!")
}

func main() {
    // customHandlerのインスタンスを作成
    handler := &customHandler{}

    // カスタムハンドラを使ってサーバーを起動
    http.ListenAndServe(":8080", handler)
}

8. カスタムHTTPヘッダーを設定する

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // レスポンスにカスタムヘッダーを設定
    w.Header().Set("Content-Type", "application/json")
    w.Header().Set("X-Custom-Header", "MyValue")

    // レスポンスを書き込み
    fmt.Fprintf(w, `{"message": "こんにちは、世界!"}`)
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

9. ミドルウェアの例

package main

import (
    "fmt"
    "net/http"
)

// 各リクエストをログに記録するミドルウェア
func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // リクエストパスをログに出力
        fmt.Println("リクエストパス:", r.URL.Path)
        // 次のハンドラに制御を渡す
        next.ServeHTTP(w, r)
    })
}

// 最終的なレスポンスを返すハンドラ
func finalHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "これは最終ハンドラです!")
}

func main() {
    // 新しいServeMuxを作成
    mux := http.NewServeMux()

    // 最終ハンドラを登録
    mux.HandleFunc("/", finalHandler)

    // ServeMuxをログ記録ミドルウェアでラップ
    loggedMux := loggingMiddleware(mux)

    // ミドルウェアでラップされたmuxを使用してサーバーを起動
    http.ListenAndServe(":8080", loggedMux)
}

以上がGoのnet/httpパッケージの基本的な使用例と解説です。詳細な解説が必要な部分があれば教えてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?