- 新增main9函数自定义重定向逻辑并打印请求链 - 新增main10函数实现multipart表单数据发送- 添加server_forms.go文件处理multipart表单解析 - 添加server_redirects.go文件处理重定向路由 - 引入bytes和mime/multipart包支持表单数据构造 - 在main函数中调用新增的三个测试函数
320 lines
7.0 KiB
Go
320 lines
7.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"net/http/cookiejar"
|
|
"net/url"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
mainInit()
|
|
main1()
|
|
main2()
|
|
main3()
|
|
main4()
|
|
main5()
|
|
main6()
|
|
main7()
|
|
main8()
|
|
main9()
|
|
main10()
|
|
}
|
|
|
|
func mainInit() {
|
|
Printfln("Starting HTTP Server")
|
|
go http.ListenAndServe("localhost:5000", nil)
|
|
|
|
time.Sleep(time.Second)
|
|
}
|
|
|
|
func main1() {
|
|
Printfln("\n\nmain1:")
|
|
response, err := http.Get("http://localhost:5000/html")
|
|
if err != nil {
|
|
Printfln("Error: %v", err.Error())
|
|
return
|
|
}
|
|
|
|
Printfln("Status: %v", response.Status)
|
|
Printfln("Headers: %v", response.Header)
|
|
|
|
Printfln("\n response.Write: ------ ")
|
|
response.Write(os.Stdout)
|
|
}
|
|
|
|
func main2() {
|
|
Printfln("\n\nmain2:")
|
|
response, err := http.Get("http://localhost:5000/html")
|
|
if err != nil {
|
|
Printfln("Error: %v", err.Error())
|
|
return
|
|
}
|
|
|
|
Printfln("\n response.Body: ------ ")
|
|
body := response.Body
|
|
defer body.Close()
|
|
data, err := io.ReadAll(body)
|
|
if err != nil {
|
|
Printfln("Error: %v", err.Error())
|
|
return
|
|
}
|
|
os.Stdout.Write(data)
|
|
}
|
|
|
|
func main3() {
|
|
Printfln("\n\nmain3:")
|
|
response, err := http.Get("http://localhost:5000/json")
|
|
if err != nil {
|
|
Printfln("Error: %v", err.Error())
|
|
return
|
|
}
|
|
if response.StatusCode != http.StatusOK {
|
|
Printfln("Status Code: %v", response.StatusCode)
|
|
return
|
|
}
|
|
var products []Product
|
|
err = json.NewDecoder(response.Body).Decode(&products)
|
|
if err != nil {
|
|
Printfln("Decode Error: %v", err.Error())
|
|
return
|
|
}
|
|
for _, p := range products {
|
|
Printfln("Name: %v ,Category : %v , Price: $%.2f", p.Name, p.Category, p.Price)
|
|
}
|
|
}
|
|
|
|
func main4() {
|
|
Printfln("\n\nmain4:")
|
|
|
|
formData := map[string][]string{
|
|
"name": {"Kayak"},
|
|
"category": {"Watersports"},
|
|
"price": {"279"},
|
|
}
|
|
|
|
response, err := http.PostForm("http://localhost:5000/echo", formData)
|
|
if err != nil {
|
|
Printfln("Error: %v", err.Error())
|
|
return
|
|
}
|
|
if response.StatusCode != http.StatusOK {
|
|
Printfln("Status Code: %v", response.StatusCode)
|
|
return
|
|
}
|
|
defer response.Body.Close()
|
|
io.Copy(os.Stdout, response.Body)
|
|
}
|
|
|
|
func main5() {
|
|
Printfln("\n\nmain5:")
|
|
|
|
var builder strings.Builder
|
|
err := json.NewEncoder(&builder).Encode(&Kayak)
|
|
if err != nil {
|
|
Printfln("Encoder Error: %v", err.Error())
|
|
return
|
|
}
|
|
|
|
reqUrl, err := url.Parse("http://localhost:5000/echo")
|
|
if err != nil {
|
|
Printfln("URL Parse Error: %v", err.Error())
|
|
return
|
|
}
|
|
req := &http.Request{
|
|
Method: "POST",
|
|
URL: reqUrl,
|
|
Header: map[string][]string{
|
|
"Content-Type": {"application/json"},
|
|
},
|
|
Body: io.NopCloser(strings.NewReader(builder.String())),
|
|
}
|
|
response, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
Printfln("Response Error: %v", err.Error())
|
|
return
|
|
}
|
|
if response.StatusCode != http.StatusOK {
|
|
Printfln("Status Code: %v", response.StatusCode)
|
|
return
|
|
}
|
|
defer response.Body.Close()
|
|
io.Copy(os.Stdout, response.Body)
|
|
}
|
|
|
|
func main6() {
|
|
Printfln("\n\nmain6:")
|
|
|
|
var builder strings.Builder
|
|
err := json.NewEncoder(&builder).Encode(&Kayak)
|
|
if err != nil {
|
|
Printfln("Encoder Error: %v", err.Error())
|
|
return
|
|
}
|
|
|
|
req, err := http.NewRequest(http.MethodPost, "http://localhost:5000/echo", strings.NewReader(builder.String()))
|
|
if err != nil {
|
|
Printfln("Request Init Error: %v", err.Error())
|
|
return
|
|
}
|
|
req.Header.Add("Content-Type", "application/json")
|
|
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 main7() {
|
|
Printfln("\n\nmain7:")
|
|
jar, err := cookiejar.New(nil)
|
|
if err != nil {
|
|
Printfln("Cookie Error: %v", err.Error())
|
|
return
|
|
}
|
|
http.DefaultClient.Jar = jar
|
|
|
|
for i := 0; i < 3; i++ {
|
|
Printfln("\nRequest #%v --------", i+1)
|
|
req, err := http.NewRequest(http.MethodGet, "http://localhost:5000/cookie", nil)
|
|
if err != nil {
|
|
Printfln("Request Init Error: %v", err.Error())
|
|
continue
|
|
}
|
|
response, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
Printfln("Response Error: %v", err.Error())
|
|
continue
|
|
}
|
|
defer response.Body.Close()
|
|
if response.StatusCode != http.StatusOK {
|
|
Printfln("Status Code: %v", response.StatusCode)
|
|
continue
|
|
}
|
|
io.Copy(os.Stdout, response.Body)
|
|
|
|
cookies := jar.Cookies(req.URL)
|
|
for _, c := range cookies {
|
|
Printfln("\n Http Client Response Cookie: %v = %v", c.Name, c.Value)
|
|
}
|
|
}
|
|
}
|
|
|
|
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())
|
|
}
|
|
|
|
}
|