feat(http): 添加HTTP重定向和表单处理功能- 新增main8函数处理HTTP重定向请求
- 新增main9函数自定义重定向逻辑并打印请求链 - 新增main10函数实现multipart表单数据发送- 添加server_forms.go文件处理multipart表单解析 - 添加server_redirects.go文件处理重定向路由 - 引入bytes和mime/multipart包支持表单数据构造 - 在main函数中调用新增的三个测试函数
This commit is contained in:
@@ -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())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
29
25-httpclient/httpclient/server_forms.go
Normal file
29
25-httpclient/httpclient/server_forms.go
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
12
25-httpclient/httpclient/server_redirects.go
Normal file
12
25-httpclient/httpclient/server_redirects.go
Normal 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)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user