当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


GO DumpRequest用法及代码示例

GO语言"net/http/httputil"包中"DumpRequest"函数的用法及代码示例。

用法:

func DumpRequest(req *http.Request, body bool)([]byte, error)

DumpRequest 在其 HTTP/1.x 线路表示中返回给定的请求。它只能由服务器用于调试客户端请求。返回的表示只是一个近似值;初始请求的一些细节在解析为 http.Request 时会丢失。特别是,标头字段名称的顺序和大小写丢失。 multi-valued 标头中的值顺序保持不变。 HTTP/2 请求以 HTTP/1.x 形式转储,而不是其原始二进制表示形式。

如果 body 为真,DumpRequest 也会返回正文。为此,它消耗 req.Body,然后用产生相同字节的新 io ReadCloser 替换它。如果DumpRequest 返回错误,则 req 的状态未定义。

http.Request.Write 的文档详细说明了转储中包含哪些 req 字段。

例子:

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/http/httptest"
    "net/http/httputil"
    "strings"
)

func main() {
    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        dump, err := httputil.DumpRequest(r, true)
        if err != nil {
            http.Error(w, fmt.Sprint(err), http.StatusInternalServerError)
            return
        }

        fmt.Fprintf(w, "%q", dump)
    }))
    defer ts.Close()

    const body = "Go is a general-purpose language designed with systems programming in mind."
    req, err := http.NewRequest("POST", ts.URL, strings.NewReader(body))
    if err != nil {
        log.Fatal(err)
    }
    req.Host = "www.example.org"
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    b, err := io.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s", b)

}

输出:

"POST / HTTP/1.1\r\nHost: www.example.org\r\nAccept-Encoding: gzip\r\nContent-Length: 75\r\nUser-Agent: Go-http-client/1.1\r\n\r\nGo is a general-purpose language designed with systems programming in mind."

相关用法


注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 DumpRequest。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。