客户端的三个主要方法 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 属性