目录
写在前面
上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单独拎了出来,我们在这一篇一起从源码来了解一下Golang的Post请求。
发送Post请求
net/http发送Post请求很容易,下面的代码我们和Get请求一样,把响应的内容的信息打印出来了,细心的朋友可能会发现,在参数传递、和结果解析时用了三种不同的方式,我们将在后面进行解析。
示例代码
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"reflect"
"strings"
)
func main() {
resp, err := http.Post("http://httpbin.org/post",
"application/x-www-form-urlencoded",
strings.NewReader("name=Detector&mobile=1xxxxxxxx"))
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
headers := resp.Header
// headers 打印报文头部信息
for k, v := range headers {
fmt.Printf("%v, %v\n", k, v) // %v 打印interfac{}的值
}
// 打印响应信息内容
fmt.Printf("响应状态:%s,响应码: %d\n", resp.Status, resp.StatusCode)
fmt.Printf("协议:%s\n", resp.Proto)
fmt.Printf("响应内容长度: %d\n", resp.ContentLength)
fmt.Printf("编码格式:%v\n", resp.TransferEncoding) // 未指定时为空
fmt.Printf("是否压缩:%t\n", resp.Uncompressed)
fmt.Println(reflect.TypeOf(resp.Body)) // *http.gzipReader
fmt.Println(resp.Body)
buf := bytes.NewBuffer(make([]byte, 0, 512))
length, _ := buf.ReadFrom(resp.Body)
fmt.Println(len(buf.Bytes()))
fmt.Println(length)
fmt.Println(string(buf.Bytes()))
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}

文章详细介绍了如何在Golang中使用net/http包发送Post请求,包括示例代码、源码分析、参数解析和响应数据解析。文中还探讨了io.Reader接口在请求体和响应体中的应用,并通过实例验证了多种解析方法的正确性。此外,文章还展示了发送Json和XML数据的示例代码。
最低0.47元/天 解锁文章
2180

被折叠的 条评论
为什么被折叠?



