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


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。