go Http Post 傳送檔案流案例
阿新 • • 發佈:2020-12-19
我就廢話不多說了,大家還是直接看程式碼吧~
package main import ( "net/http" "net/url" "fmt" "io/ioutil" _ "io" "bytes" ) func main() { postFile() } func post() { //這是一個Post 引數會被返回的地址 strinUrl:="http://localhost:8080/aaa"`這裡寫程式碼片` resopne,err:= http.PostForm(strinUrl,url.Values{"num":{"456"},"num1":{"123"}}) if err !=nil { fmt.Println("err=",err) } defer func() { resopne.Body.Close() fmt.Println("finish") }() body,err:=ioutil.ReadAll(resopne.Body) if err!=nil { fmt.Println(" post err=",err) } fmt.Println(string(body)) } func postFile(){ //這是一個Post 引數會被返回的地址 strinUrl:="http://localhost:8080/aaa" byte,err:=ioutil.ReadFile("post.txt") resopne,err :=http.Post(strinUrl,"multipart/form-data",bytes.NewReader(byte)) if err !=nil { fmt.Println("err=",err) } defer func() { resopne.Body.Close() fmt.Println("finish") }() body,err:=ioutil.ReadAll(resopne.Body) if err!=nil { fmt.Println(" post err=",err) } fmt.Println(string(body)) }
水滴石穿。這裡把Go Http Post 引數的函式也貼了處理主要對比兩者不同之處。
補充:golang爬蟲 模擬各種情況的post請求 檔案上傳
go實現各種型別的post請求
請求測試地址
var ( requestPostURL string = "http://httpbin.org/post" // 接收檔案的服務自己實現qwq // 接收一張圖片上傳 postman的key file imagePostURL string = "/imageUpload/upload" // 接收多張圖片上傳 postman的key file imageMultiPostURL string = "/imageUpload/uploads" )
application/x-www-from-urlencoded
說明
application/x-www-from-urlencoded,會將表單內的資料轉換為鍵值對,比如,name=java&age = 23
示例
// func postXWwwFromURLEncoded() { client := http.Client{} // 不帶任何的請求資料post // req,err := http.NewRequest(http.MethodPost,requestPostURL,nil) // 帶資料 urlValues := url.Values{} urlValues.Add("name","張三") urlValues.Add("age","18") reqBody := urlValues.Encode() req,strings.NewReader(reqBody)) if err != nil { log.Println("err") } resp,err := client.Do(req) if err != nil { log.Println("err") } defer resp.Body.Close() b,err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("err") } fmt.Println(string(b)) // urlValues := url.Values{} // urlValues.Add("name","zhaofan") // urlValues.Add("age","22") // resp,_ := http.PostForm("http://httpbin.org/post",urlValues) }
raw
說明
// 也就是入參方式為json
// 可以上傳任意格式的文字,可以上傳text、json、xml、html
示例
func postRaw() { client := http.Client{} // 帶資料 json 型別 urlValues := map[string]interface{}{ "name": "jack","age": 18,"is_active": true,} b1,_ := json.Marshal(&urlValues) // b1,_ := json.Marshal(&urlValues) req,bytes.NewReader(b1)) if err != nil { log.Println("err") } resp,err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("err") } fmt.Println(string(b)) }
multipart/form-data 帶普通引數
說明
// multipart/form-data
// 既可以上傳檔案,也可以上傳鍵值對
// 上傳的欄位是檔案時,會有Content-Type來說明檔案型別;content-disposition
// 可以上傳多個檔案
示例
// multipart/form-data 帶普通引數 key-value func postFormDataWithParams() { client := http.Client{} // 不帶任何的請求資料post body := &bytes.Buffer{} writer := multipart.NewWriter(body) params := map[string]string{ "name": "zhangsan","age": "12",} for key,val := range params { _ = writer.WriteField(key,val) } writer.Close() req,body) if err != nil { log.Println("err") } resp,err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("err") } fmt.Println(string(b)) }
multipart/form-data 上傳一個檔案
// key:file 裡面放一個檔案 // multipart/form-data 傳一個檔案 func postFormDataWithSingleFile() { client := http.Client{} bodyBuf := &bytes.Buffer{} bodyWrite := multipart.NewWriter(bodyBuf) file,err := os.Open("./images/img.jpg") defer file.Close() if err != nil { log.Println("err") } // file 為key fileWrite,err := bodyWrite.CreateFormFile("file","img.jpg") _,err = io.Copy(fileWrite,file) if err != nil { log.Println("err") } bodyWrite.Close() //要關閉,會將w.w.boundary刷寫到w.writer中 // 建立請求 contentType := bodyWrite.FormDataContentType() req,imagePostURL,bodyBuf) if err != nil { log.Println("err") } // 設定頭 req.Header.Set("Content-Type",contentType) resp,err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("err") } fmt.Println(string(b)) }
multipart/form-data 上傳多個檔案
// key:file 裡面放多個檔案 // multipart/form-data 傳多個檔案 func postFormDataWithMultipartFile() { client := http.Client{} bodyBuf := &bytes.Buffer{} bodyWrite := multipart.NewWriter(bodyBuf) images := []string{"img.jpg","img1.jpg"} for _,val := range images { file,err := os.Open("./images/" + val) defer file.Close() if err != nil { log.Println("err") } fileWrite,val) _,file) if err != nil { log.Println("err") } } bodyWrite.Close() //要關閉,會將w.w.boundary刷寫到w.writer中 // 建立請求 req,bodyBuf) if err != nil { log.Println("err") } // 設定頭 contentType := bodyWrite.FormDataContentType() req.Header.Set("Content-Type",err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("err") } fmt.Println(string(b)) }
binary
// Content-Type:application/octet-stream,從字面意思得知,只可以上傳二進位制資料,通常用來上傳檔案, // 由於沒有鍵值,所以,一次只能上傳一個檔案 func postBinary() { }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。