Skip to content

ドメインクライアントとセッション

ドメインクライアント(DomainClient)は同一ドメインに対するセッション管理クライアントで、Cookie とヘッダーを自動的に維持します。

ドメインクライアントの作成

go
dc, err := httpc.NewDomain("https://api.example.com")
if err != nil {
    log.Fatal(err)
}
defer dc.Close()

// Cookie は自動的に有効
dc.SetHeader("Authorization", "Bearer "+token)

// 相対パスでリクエストを送信
result, err := dc.Get("/users")

TIP

NewDomain は自動的に Cookie 管理を有効にします(EnableCookies = true)。手動設定は不要です。

セッションヘッダー管理

go
// セッションヘッダーの設定(以降のすべてのリクエストに自動付与)
dc.SetHeader("Authorization", "Bearer "+token)
dc.SetHeader("Accept", "application/json")

// 一括設定
dc.SetHeaders(map[string]string{
    "Authorization": "Bearer " + token,
    "Accept":        "application/json",
    "X-Version":     "2.0",
})

// 削除とクリア
dc.DeleteHeader("X-Version")
dc.ClearHeaders()

// 取得
headers := dc.GetHeaders()
go
// Cookie の設定
dc.SetCookie(&http.Cookie{Name: "session", Value: "abc123"})

// 一括設定
dc.SetCookies([]*http.Cookie{
    {Name: "session", Value: "abc123"},
    {Name: "lang", Value: "ja"},
})

// レスポンス Cookie の自動キャプチャ
result, _ := dc.Get("/login")
// サーバーが返す Set-Cookie は自動的にセッションに保存

// 取得
cookie := dc.GetCookie("session")
cookies := dc.GetCookies()

// 削除とクリア
dc.DeleteCookie("session")
dc.ClearCookies()

TIP

リクエストのたびに、サーバーが返す Cookie が自動的にセッションに更新されるため、手動で処理する必要はありません。

リクエスト方法

go
// 相対パス
result, _ := dc.Get("/users")
result, _ := dc.Post("/users", httpc.WithJSON(data))
result, _ := dc.Put("/users/1", httpc.WithJSON(data))
result, _ := dc.Patch("/users/1", httpc.WithJSON(data))
result, _ := dc.Delete("/users/1")
result, _ := dc.Head("/users/1")
result, _ := dc.Options("/users")

// コンテキスト付き
result, _ := dc.Request(ctx, "GET", "/users")

// 絶対 URL(ベース URL の結合をスキップ)
result, _ := dc.Get("https://other-api.com/data")

リクエストオプションは 2 回適用されます

ドメインクライアントは内部でリクエストオプションを2 回適用します(セッション状態のキャプチャ用と実際のリクエスト用)。副作用のあるオプション(カウンター、nonce 生成など)は避けてください。このようなオプションが必要な場合は、基になる Client を使用してください。

セッションアクセス

go
// 基本情報の取得
dc.URL()     // "https://api.example.com"
dc.Domain()  // "api.example.com"

// 内部 SessionManager へのアクセス
session := dc.Session()
if err := session.SetHeader("X-Trace-ID", traceID); err != nil {
    log.Fatal(err)
}

Cookie セキュリティポリシーを設定して、セキュリティ基準に準拠する Cookie のみを受け付けることができます:

go
dc, _ := httpc.NewDomain("https://api.example.com")

// 厳格な Cookie セキュリティを設定
session := dc.Session()
session.SetCookieSecurity(httpc.StrictCookieSecurityConfig())
// 要求:Secure=true, HttpOnly=true, SameSite=Strict

// セキュリティ要件を満たさない Cookie は SetCookie でエラーを返す
if err := dc.SetCookie(&http.Cookie{
    Name:  "insecure",
    Value: "test",
    // Secure, HttpOnly が不足 → 拒否される
}); err != nil {
    log.Println("Cookie が拒否されました:", err)
}

完全な例:REST API クライアント

go
package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/cybergodev/httpc"
)

func main() {
    // ドメインクライアントの作成
    dc, err := httpc.NewDomain("https://api.example.com")
    if err != nil {
        log.Fatal(err)
    }
    defer dc.Close()

    // ログインして Token を取得
    loginResult, err := dc.Post("/auth/login", httpc.WithJSON(map[string]string{
        "username": "admin",
        "password": "secret",
    }))
    if err != nil {
        log.Fatal(err)
    }

    // レスポンスから Token を解析
    var loginResp struct {
        Token string `json:"token"`
    }
    if err := loginResult.Unmarshal(&loginResp); err != nil {
        log.Fatal(err)
    }

    // セッションヘッダーの設定
    if err := dc.SetHeader("Authorization", "Bearer "+loginResp.Token); err != nil {
        log.Fatal(err)
    }

    // 以降のリクエストには自動的に Token と Cookie が付与される
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()

    users, err := dc.Request(ctx, "GET", "/users")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(users.StatusCode()) // 200
}

次のステップ