Go HTTP客户端

本文介绍了Go语言中HTTP客户端的使用,包括Get方法、Post方法、PostForm以及如何获取Response。通过示例代码展示了如何进行HTTP请求,并解释了请求过程和不同方法的特点,如Post方法的contentType设置和PostForm的url.Values数据类型。
摘要由CSDN通过智能技术生成


客户端的三个主要方法 Get, Post, PostTForm

Get方法

语法http.Get(url string) (resp *http.Response, err error)

  • 返回一个*http.Response, resp.Body实现了io.Reader 接口, 因此可以用ioutil.ReadAll() 读出到一个缓冲区。或者用io.Copy()输出到io.Writer

客户端基本交互:请求一个网页的过程如下

func Req(url string) {
	// 发出请求
	resp, err := http.Get(url)
	checkerr(err)
    defer resp.Body.close() // 随时必须记住close
}
func checkerr(err error) {
	if err != nil {
		fmt.Fprintf(os.Stderr, "%v\n", err) // 输出error到标准输出
		os.Exit(1)                          //一旦遇到错误立即退出程序
	}
}

Post方法

POST方法上传

语法:

Post(url string, contentType string, body io.Reader) (resp *http.Response, err error)

contentType:数据类型

说明字符串的类型, 对应form表单的enctype属性

application/x-www-form-urlencoded (默认)不设置 enctype 属性的原生 form 表单提交方式。

multipart/form-data 上传文件时的数据提交方式,相当于 form 表单的 enctype 等于 multipart/form-data 。

application/json 用来告诉服务端消息主体是序列化后的 JSON 字符串。

text/xml

  • body:实现了io.Reader接口的数据。 如果是string数据, 可以使用 strings.NewReader()来转换类型

    示例:

    body := strings.NewReader("username=BigRainKing&age=99&password=1234")

    在Server接收到的数据就是:

    map[age:[99] password:[1234] username:[BigRainKing]]

示例

Client.go

func Req(url string) {
	body := strings.NewReader("username=BigRainKing&age=99&password=1234")
	resp, err := http.Post(url, "application/x-www-form-urlencoded", body)
	checkerr(err)
	defer resp.Body.Close()

	io.Copy(os.Stdout, resp.Body)
}

Server.go

func login(w http.ResponseWriter, r *http.Request) {
	if r.Method == "GET" {      
        //展现前端页面...
	} else {
		r.ParseForm() // 解析form表单数据
		fmt.Println(r.Form)
	}
}

客户端响应:

method: POST
map[age:[99] password:[1234] username:[BigRainKing]]

PostForm

语法

PostForm(url string, data url.Values) (resp *http.Response, err error)
  • url:需要加上 “http://” or “https://”
  • url.Values 类型的数据: 类型实际是Type Values map[string][]string

示例:

Client.go

func Req(url string) {
	data := map[string][]string{"username": {"BigRainKing", "papa"}, "password": {"123456"}, "gg": {"no"}}
	resp, err := http.PostForm(url, data)
	checkerr(err)
	defer resp.Body.Close()
}

func checkerr(err error) {
	if err != nil {
		fmt.Fprintf(os.Stderr, "%v\n", err) // 输出error到标准输出
		os.Exit(1)                          //一旦遇到错误立即退出程序
	}
}
func main() {
	Req("http://localhost:8080/login")
}

服务器输出:

method: POST
map[gg:[no] password:[123456] username:[BigRainKing papa]]

获取Response

// 获取Response响应体 : 直接将body输出到stdout
_, err = io.Copy(os.Stdout, resp.Body)
checkerr(err)
    
// 方法二:输出到缓冲区 使用ioutil.ReadAll()
b, er = ioutil.ReadAll(resp.Body)
fmt.Printf("%s\n", b) //格式化后输出:因为ReadAll返回的是数字切片

ioutil.ReadAll():

ioutil.ReadAll(r io.Reader) ([]*byte*, *error*)

io.Copy()

io.Copy(dst io.Writer, src io.Reader) (written *int64*, err *error*)

Reference

1.HTTP客户端
2. HTML:Form表单标签的Enctype属性的作用及应用示例介绍
3. 《W3Cschool》HTML 标签的 enctype 属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值