我就廢話不多說了,大家還是直接看代碼吧~
package main
import (
"net/http"
"net/url"
"fmt"
"io/ioutil"
_ "io"
"bytes"
)
func main() {
postFile()
}
func post() {
//這是一個Post 參數(shù)會被返回的地址
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 參數(shù)會被返回的地址
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 參數(shù)的函數(shù)也貼了處理主要對比兩者不同之處。
補充:golang爬蟲 模擬各種情況的post請求 文件上傳
go實現(xiàn)各種類型的post請求
請求測試地址
var (
requestPostURL string = "http://httpbin.org/post"
// 接收文件的服務自己實現(xiàn)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,會將表單內的數(shù)據(jù)轉換為鍵值對,比如,name=javaage = 23
示例
//
func postXWwwFromURLEncoded() {
client := http.Client{}
// 不帶任何的請求數(shù)據(jù)post
// req, err := http.NewRequest(http.MethodPost, requestPostURL, nil)
// 帶數(shù)據(jù)
urlValues := url.Values{}
urlValues.Add("name", "張三")
urlValues.Add("age", "18")
reqBody := urlValues.Encode()
req, err := http.NewRequest(http.MethodPost, requestPostURL, 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
說明
// 也就是入?yún)⒎绞綖閖son
// 可以上傳任意格式的文本,可以上傳text、json、xml、html
示例
func postRaw() {
client := http.Client{}
// 帶數(shù)據(jù) json 類型
urlValues := map[string]interface{}{
"name": "jack",
"age": 18,
"is_active": true,
}
b1, _ := json.Marshal(urlValues)
// b1, _ := json.Marshal(urlValues)
req, err := http.NewRequest(http.MethodPost, requestPostURL, bytes.NewReader(b1))
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))
}
multipart/form-data 帶普通參數(shù)
說明
// multipart/form-data
// 既可以上傳文件,也可以上傳鍵值對
// 上傳的字段是文件時,會有Content-Type來說明文件類型;content-disposition
// 可以上傳多個文件
示例
// multipart/form-data 帶普通參數(shù) key-value
func postFormDataWithParams() {
client := http.Client{}
// 不帶任何的請求數(shù)據(jù)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, err := http.NewRequest(http.MethodPost, requestPostURL, body)
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))
}
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中
// 創(chuàng)建請求
contentType := bodyWrite.FormDataContentType()
req, err := http.NewRequest(http.MethodPost, imagePostURL, bodyBuf)
if err != nil {
log.Println("err")
}
// 設置頭
req.Header.Set("Content-Type", contentType)
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))
}
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, err := bodyWrite.CreateFormFile("file", val)
_, err = io.Copy(fileWrite, file)
if err != nil {
log.Println("err")
}
}
bodyWrite.Close() //要關閉,會將w.w.boundary刷寫到w.writer中
// 創(chuàng)建請求
req, err := http.NewRequest(http.MethodPost, imagePostURL, bodyBuf)
if err != nil {
log.Println("err")
}
// 設置頭
contentType := bodyWrite.FormDataContentType()
req.Header.Set("Content-Type", contentType)
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))
}
binary
// Content-Type:application/octet-stream,從字面意思得知,只可以上傳二進制數(shù)據(jù),通常用來上傳文件,
// 由于沒有鍵值,所以,一次只能上傳一個文件
func postBinary() {
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- 在golang xorm中使用postgresql的json,array類型的操作
- golang使用http client發(fā)起get和post請求示例
- GO接收GET/POST參數(shù)及發(fā)送GET/POST請求的實例詳解
- golang post請求常用的幾種方式小結