You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 5 Next »
我们来看几个HTTP客户端请求的简单示例。
发送GET请求,并打印出返回值
GET
if r, err := g.Client().Get(ctx, "https://goframe.org"); err != nil { panic(err) } else { defer r.Close() fmt.Println(r.ReadAllString()) }
发送GET请求,下载远程文件
if r, err := g.Client().Get(ctx, "https://goframe.org/cover.png"); err != nil { panic(err) } else { defer r.Close() gfile.PutBytes("/Users/john/Temp/cover.png", r.ReadAll()) }
下载文件操作,小文件下载非常简单。需要注意的是,如果远程文件比较大时,服务端会分批返回数据,因此会需要客户端发多个GET请求,每一次通过Header来请求分批的文件范围长度,感兴趣的同学可自行研究相关细节。
Header
发送POST请求,并打印出返回值
POST
if r, err := g.Client().Post(ctx, "http://127.0.0.1:8199/form", "name=john&age=18"); err != nil { panic(err) } else { defer r.Close() fmt.Println(r.ReadAllString()) }
传递多参数的时候用户可以使用&符号进行连接,注意参数值往往需要通过gurl.Encode编码一下。
&
gurl.Encode
发送POST请求,参数为map类型,并打印出返回值
map
if r, err := g.Client().Post( ctx, "http://127.0.0.1:8199/form", g.Map{ "submit" : "1", "callback" : "http://127.0.0.1/callback?url=http://baidu.com", } )); err != nil { panic(err) } else { defer r.Close() fmt.Println(r.ReadAllString()) }
传递多参数的时候用户可以使用&符号进行连接,也可以直接使用map(其实之前也提到,任意数据类型都支持,包括struct)。
struct
发送POST请求,参数为JSON数据,并打印出返回值
JSON
if r, err := g.Client().Post( ctx, "http://user.svc/v1/user/create", `{"passport":"john","password":"123456","password-confirm":"123456"}`, ); err != nil { panic(err) } else { defer r.Close() fmt.Println(r.ReadAllString()) }
可以看到,通过ghttp客户端发送JSON数据请求非常方便,直接通过Post方法提交即可,客户端会自动将请求的Content-Type设置为application/json。
ghttp
Post
Content-Type
application/json
发送DELETE请求,并打印出返回值
DELETE
if r, err := g.Client().Delete(ctx, "http://user.svc/v1/user/delete/1", "10000"); err != nil { panic(err) } else { defer r.Close() fmt.Println(r.ReadAllString()) }
*Bytes
*Content
以Bytes及Content后缀结尾的请求方法为直接获取返回内容的快捷方法,这些方法将会自动读取服务端返回内容并自动关闭请求连接。需要注意的是,如果请求执行失败,返回内容将会为空。
Bytes
Content
// 返回content为[]bytes类型 content := g.Client().GetBytes(ctx, "https://goframe.org")
// 返回content为string类型 content := g.Client().GetContent(ctx, "https://goframe.org")
// 返回content为[]bytes类型 content := g.Client().PostBytes( ctx, "http://user.svc/v1/user/create", `{"passport":"john","password":"123456","password-confirm":"123456"}`, )
// 返回content为string类型 content := g.Client().PostContent( ctx, "http://user.svc/v1/user/create", `{"passport":"john","password":"123456","password-confirm":"123456"}`, )
*Var
以Var后缀结尾的请求方法直接请求并获取HTTP接口结果为泛型类型便于转换。往往用于服务端返回格式为JSON/XML的情况,通过返回的gvar.Var泛型对象可根据需要自动解析。此外,如果请求失败或者请求结果为空,会返回一个空的g.Var泛型对象,不影响转换方法调用。
Var
JSON/XML
gvar.Var
g.Var
使用示例:
type User struct { Id int Name string }
// Struct var user *User // 也可以 // var user = new(User) g.Client().GetVar(ctx, url).Scan(&user)
// Struct数组 var users []*User // 也可以 // var users []User g.Client().GetVar(ctx, url).Scan(&users)