go Http Post 发送文件流案例
我就废话不多说了,大家还是直接看代码吧~
packagemain
import(
"net/http"
"net/url"
"fmt"
"io/ioutil"
_"io"
"bytes"
)
funcmain(){
postFile()
}
funcpost(){
//这是一个Post参数会被返回的地址
strinUrl:="http://localhost:8080/aaa"`这里写代码片`
resopne,err:=http.PostForm(strinUrl,url.Values{"num":{"456"},"num1":{"123"}})
iferr!=nil{
fmt.Println("err=",err)
}
deferfunc(){
resopne.Body.Close()
fmt.Println("finish")
}()
body,err:=ioutil.ReadAll(resopne.Body)
iferr!=nil{
fmt.Println("posterr=",err)
}
fmt.Println(string(body))
}
funcpostFile(){
//这是一个Post参数会被返回的地址
strinUrl:="http://localhost:8080/aaa"
byte,err:=ioutil.ReadFile("post.txt")
resopne,err:=http.Post(strinUrl,"multipart/form-data",bytes.NewReader(byte))
iferr!=nil{
fmt.Println("err=",err)
}
deferfunc(){
resopne.Body.Close()
fmt.Println("finish")
}()
body,err:=ioutil.ReadAll(resopne.Body)
iferr!=nil{
fmt.Println("posterr=",err)
}
fmt.Println(string(body))
}
水滴石穿。这里把GoHttpPost参数的函数也贴了处理主要对比两者不同之处。
补充:golang爬虫模拟各种情况的post请求文件上传
go实现各种类型的post请求
请求测试地址
var( requestPostURLstring="http://httpbin.org/post" //接收文件的服务自己实现qwq //接收一张图片上传postman的keyfile imagePostURLstring="/imageUpload/upload" //接收多张图片上传postman的keyfile imageMultiPostURLstring="/imageUpload/uploads" )
application/x-www-from-urlencoded
说明
application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,name=java&age=23
示例
//
funcpostXWwwFromURLEncoded(){
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,err:=http.NewRequest(http.MethodPost,requestPostURL,strings.NewReader(reqBody))
iferr!=nil{
log.Println("err")
}
resp,err:=client.Do(req)
iferr!=nil{
log.Println("err")
}
deferresp.Body.Close()
b,err:=ioutil.ReadAll(resp.Body)
iferr!=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
示例
funcpostRaw(){
client:=http.Client{}
//带数据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))
iferr!=nil{
log.Println("err")
}
resp,err:=client.Do(req)
iferr!=nil{
log.Println("err")
}
deferresp.Body.Close()
b,err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
log.Println("err")
}
fmt.Println(string(b))
}
multipart/form-data带普通参数
说明
//multipart/form-data
//既可以上传文件,也可以上传键值对
//上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition
//可以上传多个文件
示例
//multipart/form-data带普通参数key-value
funcpostFormDataWithParams(){
client:=http.Client{}
//不带任何的请求数据post
body:=&bytes.Buffer{}
writer:=multipart.NewWriter(body)
params:=map[string]string{
"name":"zhangsan",
"age":"12",
}
forkey,val:=rangeparams{
_=writer.WriteField(key,val)
}
writer.Close()
req,err:=http.NewRequest(http.MethodPost,requestPostURL,body)
iferr!=nil{
log.Println("err")
}
resp,err:=client.Do(req)
iferr!=nil{
log.Println("err")
}
deferresp.Body.Close()
b,err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
log.Println("err")
}
fmt.Println(string(b))
}
multipart/form-data上传一个文件
//key:file里面放一个文件
//multipart/form-data传一个文件
funcpostFormDataWithSingleFile(){
client:=http.Client{}
bodyBuf:=&bytes.Buffer{}
bodyWrite:=multipart.NewWriter(bodyBuf)
file,err:=os.Open("./images/img.jpg")
deferfile.Close()
iferr!=nil{
log.Println("err")
}
//file为key
fileWrite,err:=bodyWrite.CreateFormFile("file","img.jpg")
_,err=io.Copy(fileWrite,file)
iferr!=nil{
log.Println("err")
}
bodyWrite.Close()//要关闭,会将w.w.boundary刷写到w.writer中
//创建请求
contentType:=bodyWrite.FormDataContentType()
req,err:=http.NewRequest(http.MethodPost,imagePostURL,bodyBuf)
iferr!=nil{
log.Println("err")
}
//设置头
req.Header.Set("Content-Type",contentType)
resp,err:=client.Do(req)
iferr!=nil{
log.Println("err")
}
deferresp.Body.Close()
b,err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
log.Println("err")
}
fmt.Println(string(b))
}
multipart/form-data上传多个文件
//key:file里面放多个文件
//multipart/form-data传多个文件
funcpostFormDataWithMultipartFile(){
client:=http.Client{}
bodyBuf:=&bytes.Buffer{}
bodyWrite:=multipart.NewWriter(bodyBuf)
images:=[]string{"img.jpg","img1.jpg"}
for_,val:=rangeimages{
file,err:=os.Open("./images/"+val)
deferfile.Close()
iferr!=nil{
log.Println("err")
}
fileWrite,err:=bodyWrite.CreateFormFile("file",val)
_,err=io.Copy(fileWrite,file)
iferr!=nil{
log.Println("err")
}
}
bodyWrite.Close()//要关闭,会将w.w.boundary刷写到w.writer中
//创建请求
req,err:=http.NewRequest(http.MethodPost,imagePostURL,bodyBuf)
iferr!=nil{
log.Println("err")
}
//设置头
contentType:=bodyWrite.FormDataContentType()
req.Header.Set("Content-Type",contentType)
resp,err:=client.Do(req)
iferr!=nil{
log.Println("err")
}
deferresp.Body.Close()
b,err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
log.Println("err")
}
fmt.Println(string(b))
}
binary
//Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,
//由于没有键值,所以,一次只能上传一个文件
funcpostBinary(){
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。