From ddafa8ef7ada90d5f21187b5371f7eed37ec589d Mon Sep 17 00:00:00 2001 From: yanzuoguang Date: Sun, 26 Oct 2025 23:35:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(http):=20=E6=B7=BB=E5=8A=A0HTTP=E9=87=8D?= =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=92=8C=E8=A1=A8=E5=8D=95=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD-=20=E6=96=B0=E5=A2=9Emain8=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=A4=84=E7=90=86HTTP=E9=87=8D=E5=AE=9A=E5=90=91=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=20-=20=E6=96=B0=E5=A2=9Emain9=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=87=8D=E5=AE=9A=E5=90=91=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E6=89=93=E5=8D=B0=E8=AF=B7=E6=B1=82=E9=93=BE?= =?UTF-8?q?=20-=20=E6=96=B0=E5=A2=9Emain10=E5=87=BD=E6=95=B0=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0multipart=E8=A1=A8=E5=8D=95=E6=95=B0=E6=8D=AE=E5=8F=91?= =?UTF-8?q?=E9=80=81-=20=E6=B7=BB=E5=8A=A0server=5Fforms.go=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=84=E7=90=86multipart=E8=A1=A8=E5=8D=95=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=20-=20=E6=B7=BB=E5=8A=A0server=5Fredirects.go?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=84=E7=90=86=E9=87=8D=E5=AE=9A=E5=90=91?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=20-=20=E5=BC=95=E5=85=A5bytes=E5=92=8Cmime/m?= =?UTF-8?q?ultipart=E5=8C=85=E6=94=AF=E6=8C=81=E8=A1=A8=E5=8D=95=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9E=84=E9=80=A0=20-=20=E5=9C=A8main=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=B8=AD=E8=B0=83=E7=94=A8=E6=96=B0=E5=A2=9E=E7=9A=84?= =?UTF-8?q?=E4=B8=89=E4=B8=AA=E6=B5=8B=E8=AF=95=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 25-httpclient/httpclient/main.go | 111 +++++++++++++++++++ 25-httpclient/httpclient/server_forms.go | 29 +++++ 25-httpclient/httpclient/server_redirects.go | 12 ++ 3 files changed, 152 insertions(+) create mode 100644 25-httpclient/httpclient/server_forms.go create mode 100644 25-httpclient/httpclient/server_redirects.go diff --git a/25-httpclient/httpclient/main.go b/25-httpclient/httpclient/main.go index 174d3e9..d883524 100644 --- a/25-httpclient/httpclient/main.go +++ b/25-httpclient/httpclient/main.go @@ -1,8 +1,10 @@ package main import ( + "bytes" "encoding/json" "io" + "mime/multipart" "net/http" "net/http/cookiejar" "net/url" @@ -20,6 +22,9 @@ func main() { main5() main6() main7() + main8() + main9() + main10() } func mainInit() { @@ -206,3 +211,109 @@ func main7() { } } } + +func main8() { + Printfln("\n\nmain8:") + + req, err := http.NewRequest(http.MethodGet, "http://localhost:5000/redirect1", nil) + if err != nil { + Printfln("Request Init Error: %v", err.Error()) + return + } + response, err := http.DefaultClient.Do(req) + if err != nil { + Printfln("Response Error: %v", err.Error()) + return + } + defer response.Body.Close() + if response.StatusCode != http.StatusOK { + Printfln("Status Code: %v", response.StatusCode) + return + } + io.Copy(os.Stdout, response.Body) +} + +func main9() { + Printfln("\n\nmain9:") + defer func() { + http.DefaultClient.CheckRedirect = nil + }() + http.DefaultClient.CheckRedirect = func(req *http.Request, previous []*http.Request) error { + if len(previous) == 3 { + for _, r := range previous { + Printfln("Previous Request: %v", r.URL.String()) + } + Printfln("Now Request: %v", req.URL.String()) + u, _ := url.Parse("http://localhost:5000/html") + req.URL = u + } + return nil + } + req, err := http.NewRequest(http.MethodGet, "http://localhost:5000/redirect1", nil) + if err != nil { + Printfln("Request Init Error: %v", err.Error()) + return + } + response, err := http.DefaultClient.Do(req) + if err != nil { + Printfln("Response Error: %v", err.Error()) + return + } + defer response.Body.Close() + if response.StatusCode != http.StatusOK { + Printfln("Status Code: %v", response.StatusCode) + return + } + io.Copy(os.Stdout, response.Body) +} + +func main10() { + Printfln("\n\nmain10:") + + var buffer bytes.Buffer + formWriter := multipart.NewWriter(&buffer) + fieldWriter, err := formWriter.CreateFormField("name") + if err == nil { + io.WriteString(fieldWriter, "Yanzuoguang") + } + fieldWriter, err = formWriter.CreateFormField("city") + if err == nil { + io.WriteString(fieldWriter, "重庆") + io.WriteString(fieldWriter, "渝北区") + } + fieldWriter, err = formWriter.CreateFormField("city") + if err == nil { + io.WriteString(fieldWriter, "上海") + } + fileWriter, err := formWriter.CreateFormFile("file", "printer.go") + if err == nil { + file, err := os.Open("printer.go") + if err == nil { + defer file.Close() + io.Copy(fileWriter, file) + } + } + fileWriter, err = formWriter.CreateFormFile("file", "go.mod") + if err == nil { + file, err := os.Open("go.mod") + if err == nil { + defer file.Close() + io.Copy(fileWriter, file) + } + } + formWriter.Close() + + req, err := http.NewRequest(http.MethodPost, "http://localhost:5000/form", &buffer) + if err == nil { + req.Header.Add("Content-Type", formWriter.FormDataContentType()) + response, err := http.DefaultClient.Do(req) + if err == nil { + io.Copy(os.Stdout, response.Body) + } else { + Printfln("Response Error: %v", err.Error()) + } + } else { + Printfln("Request Init Error: %v", err.Error()) + } + +} diff --git a/25-httpclient/httpclient/server_forms.go b/25-httpclient/httpclient/server_forms.go new file mode 100644 index 0000000..e077699 --- /dev/null +++ b/25-httpclient/httpclient/server_forms.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "io" + "net/http" +) + +func init() { + http.HandleFunc("/form", func(writer http.ResponseWriter, request *http.Request) { + err := request.ParseMultipartForm(10 * 60 * 1000) + if err != nil { + http.Error(writer, err.Error(), http.StatusInternalServerError) + return + } + for key, values := range request.MultipartForm.Value { + Printfln("Field: %v : %v", key, values) + } + for name, files := range request.MultipartForm.File { + for _, file := range files { + fmt.Fprintf(writer, "File %v : %v \n", name, file.Filename) + if f, err := file.Open(); err == nil { + defer f.Close() + io.Copy(writer, f) + } + } + } + }) +} diff --git a/25-httpclient/httpclient/server_redirects.go b/25-httpclient/httpclient/server_redirects.go new file mode 100644 index 0000000..ca32ac2 --- /dev/null +++ b/25-httpclient/httpclient/server_redirects.go @@ -0,0 +1,12 @@ +package main + +import "net/http" + +func init() { + http.HandleFunc("/redirect1", func(writer http.ResponseWriter, request *http.Request) { + http.Redirect(writer, request, "/redirect2", http.StatusTemporaryRedirect) + }) + http.HandleFunc("/redirect2", func(writer http.ResponseWriter, request *http.Request) { + http.Redirect(writer, request, "/redirect1", http.StatusTemporaryRedirect) + }) +}