golang几种post请求方式
本文内容纲要:
-get请求
-post请求
-一种是使用http.Post方式
-一种是使用http.PostForm方法
-复杂的请求
get请求
get请求可以直接http.Get方法,非常简单。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
func httpGet(){
resp,err:=http.Get( "http://www.01happy.com/demo/accept.php?id=1" )
if err!=nil{
//handleerror
}
defer resp.Body.Close()
body,err:=ioutil.ReadAll(resp.Body)
if err!=nil{
//handleerror
}
fmt.Println(string(body))
}
|
post请求
一种是使用http.Post方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
func httpPost(){
resp,err:=http.Post( "http://www.01happy.com/demo/accept.php" ,
"application/x-www-form-urlencoded" ,
strings.NewReader( "name=cjb" ))
if err!=nil{
fmt.Println(err)
}
defer resp.Body.Close()
body,err:=ioutil.ReadAll(resp.Body)
if err!=nil{
//handleerror
}
fmt.Println(string(body))
}
|
Tips:使用这个方法的话,第二个参数要设置成”application/x-www-form-urlencoded”,否则post参数无法传递。
一种是使用http.PostForm方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
func httpPostForm(){
resp,err:=http.PostForm( "http://www.01happy.com/demo/accept.php" ,
url.Values{ "key" :{ "Value" }, "id" :{ "123" }})
if err!=nil{
//handleerror
}
defer resp.Body.Close()
body,err:=ioutil.ReadAll(resp.Body)
if err!=nil{
//handleerror
}
fmt.Println(string(body))
}
|
复杂的请求
有时需要在请求的时候设置头参数、cookie之类的数据,就可以使用http.Do方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
func httpDo(){
client:=&http.Client{}
req,err:=http.NewRequest( "POST" , "http://www.01happy.com/demo/accept.php" ,strings.NewReader( "name=cjb" ))
if err!=nil{
//handleerror
}
req.Header.Set( "Content-Type" , "application/x-www-form-urlencoded" )
req.Header.Set( "Cookie" , "name=anny" )
resp,err:=client.Do(req)
defer resp.Body.Close()
body,err:=ioutil.ReadAll(resp.Body)
if err!=nil{
//handleerror
}
fmt.Println(string(body))
}
|
同上面的post请求,必须要设定Content-Type为application/x-www-form-urlencoded,post参数才可正常传递。
如果要发起head请求可以直接使用httpclient的head方法,比较简单,这里就不再说明。
用golang进行http请求类型多了,总结备忘一下。
1.普通的post\get请求
varrhttp.Request
r.ParseForm()
r.Form.Add("uuid",orderUUID)
bodystr:=strings.TrimSpace(r.Form.Encode())
request,err:=http.NewRequest("GET",url,strings.NewReader(bodystr))
iferr!=nil{
//TODO:
}
request.Header.Set("Content-Type","application/x-www-form-urlencoded")
request.Header.Set("Connection","Keep-Alive")
varresp*http.Response
resp,err=http.DefaultClient.Do(request)
iferr!=nil{
//TODO:
}
2.body全部二进制数据流进行post
//body提交二进制数据
funcDoBytesPost(urlstring,data[]byte)([]byte,error){
body:=bytes.NewReader(data)
request,err:=http.NewRequest(POST_METHOD,url,body)
iferr!=nil{
log.Println("http.NewRequest,[err=%s][url=%s]",err,url)
return[]byte(""),err
}
request.Header.Set("Connection","Keep-Alive")
varresp*http.Response
resp,err=http.DefaultClient.Do(request)
iferr!=nil{
log.Println("http.Dofailed,[err=%s][url=%s]",err,url)
return[]byte(""),err
}
deferresp.Body.Close()
b,err:=ioutil.ReadAll(resp.Body)
iferr!=nil{
log.Println("http.Dofailed,[err=%s][url=%s]",err,url)
}
returnb,err
}
3.模拟web表单文件上传进行post
funcnewfileUploadRequest(uristring,paramsmap[string]string,paramName,pathstring)(*http.Request,error){
file,err:=os.Open(path)
iferr!=nil{
returnnil,err
}
deferfile.Close()
body:=&bytes.Buffer{}
writer:=multipart.NewWriter(body)
part,err:=writer.CreateFormFile(paramName,path)
iferr!=nil{
returnnil,err
}
_,err=io.Copy(part,file)
forkey,val:=rangeparams{
_=writer.WriteField(key,val)
}
err=writer.Close()
iferr!=nil{
returnnil,err
}
request,err:=http.NewRequest("POST",uri,body)
request.Header.Set("Content-Type",writer.FormDataContentType())
returnrequest,err
}
本文内容总结:get请求,post请求,一种是使用http.Post方式,一种是使用http.PostForm方法,复杂的请求,
原文链接:https://www.cnblogs.com/mafeng/p/7068837.html