Result
Result は HTTP レスポンスとリクエストメタデータをカプセル化し、便利なアクセスメソッドを提供します。Client.Request() またはパッケージレベル関数で取得します。
type Result struct {
Request *RequestInfo
Response *ResponseInfo
Meta *RequestMeta
}result, err := httpc.Get("https://api.example.com/users/1")
if err != nil {
log.Fatal(err)
}
fmt.Println(result.StatusCode()) // 200
fmt.Println(result.Body()) // {"id":1,"name":"test"}TIP
Result はリクエストごとに新規作成され、GC が自動的に回収するため、手動での解放は不要です。
基本メソッド
StatusCode
func (r *Result) StatusCode() intHTTP ステータスコードを返します。nil セーフで、0 を返します。
Body
func (r *Result) Body() stringレスポンスボディの文字列を返します。nil セーフで、空文字列を返します。
RawBody
func (r *Result) RawBody() []byteレスポンスボディの生バイトを返します。nil セーフで、nil を返します。
Proto
func (r *Result) Proto() stringHTTP プロトコルバージョンを返します(例:"HTTP/1.1"、"HTTP/2.0")。
ステータス判定
IsSuccess
func (r *Result) IsSuccess() boolステータスコードが 2xx の場合に true を返します。
IsRedirect
func (r *Result) IsRedirect() boolステータスコードが 3xx の場合に true を返します。
IsClientError
func (r *Result) IsClientError() boolステータスコードが 4xx の場合に true を返します。
IsServerError
func (r *Result) IsServerError() boolステータスコードが 5xx の場合に true を返します。
result, _ := client.Get(url)
switch {
case result.IsSuccess():
handleSuccess(result)
case result.IsClientError():
handleClientError(result)
case result.IsServerError():
handleServerError(result)
}Cookie メソッド
ResponseCookies
func (r *Result) ResponseCookies() []*http.Cookieレスポンスに含まれるすべての Cookie を返します。
GetCookie
func (r *Result) GetCookie(name string) *http.Cookie名前でレスポンス Cookie を取得します。見つからない場合は nil を返します。
cookie := result.GetCookie("session")
if cookie != nil {
fmt.Println(cookie.Value)
}HasCookie
func (r *Result) HasCookie(name string) boolレスポンスに指定した名前の Cookie が存在するかを確認します。
RequestCookies
func (r *Result) RequestCookies() []*http.Cookieリクエストで送信されたすべての Cookie を返します。
GetRequestCookie
func (r *Result) GetRequestCookie(name string) *http.Cookie名前でリクエスト Cookie を取得します。
HasRequestCookie
func (r *Result) HasRequestCookie(name string) boolリクエストに指定した名前の Cookie が存在するかを確認します。
JSON 解析
Unmarshal
func (r *Result) Unmarshal(v any) errorJSON レスポンスボディをターゲット変数に解析します。json.Unmarshal の規約に従います。
| エラー | 発生条件 |
|---|---|
ErrResponseBodyEmpty | レスポンスボディが空 |
ErrResponseBodyTooLarge | レスポンスボディが 50MB の JSON 解析サイズ制限を超過 |
var user User
if err := result.Unmarshal(&user); err != nil {
log.Fatal(err)
}
fmt.Println(user.Name)ファイル保存
SaveToFile
func (r *Result) SaveToFile(filePath string) errorレスポンスボディをファイルに保存します。ファイルパスはセキュリティ検証を通過します(パストラバーサル対策、シンボリックリンクチェック、システムパス保護)。
| エラー | 発生条件 |
|---|---|
ErrResponseBodyEmpty | レスポンスボディが空 |
result, _ := client.Get("https://example.com/data.csv")
if err := result.SaveToFile("/tmp/data.csv"); err != nil {
log.Fatal(err)
}文字列表現
String
func (r *Result) String() string人間可読の文字列表現を返します。機密ヘッダーは自動的にマスクされ、レスポンスボディは 200 文字に切り詰められます。
result, _ := client.Get(url)
fmt.Println(result.String())
// Result{Status: 200 200 OK, ContentLength: 1024, Duration: 125ms, Attempts: 1, ...}サブタイプ
RequestInfo
type RequestInfo struct {
URL string
Method string
Headers http.Header
Cookies []*http.Cookie
}リクエストの詳細。result.Request でアクセスします。
ResponseInfo
type ResponseInfo struct {
StatusCode int
Status string
Proto string
Headers http.Header
Body string
RawBody []byte
ContentLength int64
Cookies []*http.Cookie
}レスポンスデータ。result.Response でアクセスします。
RequestMeta
type RequestMeta struct {
Duration time.Duration
Attempts int
RedirectChain []string
RedirectCount int
}リクエスト実行メタデータ。result.Meta でアクセスします。
result, _ := client.Get(url)
fmt.Println(result.Meta.Duration) // 125ms
fmt.Println(result.Meta.Attempts) // 2(1 回リトライ)
fmt.Println(result.Meta.RedirectCount) // 1(1 回リダイレクトに追従)関連項目
- パッケージ関数 - Result を取得するリクエストメソッド
- リクエストオプション - リクエスト動作の設定
- ファイルダウンロード - ダウンロード結果タイプ DownloadResult