feat(http): 添加HTTP重定向和表单处理功能- 新增main8函数处理HTTP重定向请求

- 新增main9函数自定义重定向逻辑并打印请求链
- 新增main10函数实现multipart表单数据发送- 添加server_forms.go文件处理multipart表单解析
- 添加server_redirects.go文件处理重定向路由
- 引入bytes和mime/multipart包支持表单数据构造
- 在main函数中调用新增的三个测试函数
This commit is contained in:
2025-10-26 23:35:44 +08:00
parent 595e040dcb
commit ddafa8ef7a
3 changed files with 152 additions and 0 deletions

View File

@@ -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())
}
}

View File

@@ -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)
}
}
}
})
}

View File

@@ -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)
})
}