GoFrame day4
前言
上一次剩下了一个坑,那就是文件的上传部分.今天就HTTP的客户端部分进行学习总结
HTTPClient
可以使用gclient.New()
创建一个客户端对象,也可以使用g.Client()
方法调用创建对象(实际上也就是返回gclient.New()
的对象).
这里的gclient
其实也是封装了http.Client
,客户端同样提供了一系列的请求方法,但是请求结果对象在使用完毕后需要用Close()
关闭
链式操作
GoFrame的客户端支持链式操作,也就是多个方法可以链式调用
这个地方大家可以去看看官网中的例子
基本使用
简单的使用客户端请求的例子
package main import ( "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gfile" ) var ctx = gctx.New() func main() { if r, err := g.Client().Get(ctx, "https://goframe.org"); err != nil { panic(err) } else { defer r.Close() fmt.Println(r.ReadAllString()) } if r, err := g.Client().Get(ctx, "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"); err != nil { panic(err) } else { defer r.Close() gfile.PutBytes("./tmp/baidu.png", r.ReadAll()) } }
为了测试客户端post
请求,先写一个简单的服务
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) type RegisterReq struct { Name string Pass string `p:"password"` Pass2 string `p:"password-confirm"` } type RegisterRes struct { Code int `json:"code"` Error string `json:"error"` Data any `json:"data"` } func main() { s := g.Server() s.BindHandler("/data/*", func(r *ghttp.Request) { var req *RegisterReq if err := r.Parse(&req); err != nil { r.Response.WriteJsonExit(RegisterRes{ Code: 1, Error: err.Error(), }) } r.Response.WriteJsonExit(RegisterRes{ Data: req, }) }) s.SetPort(8080) s.Run() } 复制代码
然后再来试试post
来传入数据
if r, err := g.Client().Post( ctx, "http://localhost:8080/data", `{"name":"shelgi","password":"123456","password-confirm":"123456"}`, ); err != nil { panic(err) } else { defer r.Close() fmt.Println(r.ReadAllString()) } 复制代码
文件上传
终于开始填之前的坑了,文件上传又可以分为单文件上传和多文件上传以及表单文件上传.如果我们想限定文件类型,那么就需要利用正则进行判断.
上传服务端
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) // Upload uploads files to /tmp . func Upload(r *ghttp.Request) { files := r.GetUploadFiles("upload-file") names, err := files.Save("./tmp/") if err != nil { r.Response.WriteExit(err) } println(names) r.Response.WriteExit("upload successfully: ", names) } // UploadShow shows uploading simgle file page. func UploadShow(r *ghttp.Request) { r.Response.Write(` <html> <head> <title>GF Upload File Demo</title> </head> <body> <form enctype="multipart/form-data" action="/upload" method="post"> <input type="file" name="upload-file" /> <input type="submit" value="upload" /> </form> </body> </html> `) } // UploadShowBatch shows uploading multiple files page. func UploadShowBatch(r *ghttp.Request) { r.Response.Write(` <html> <head> <title>GF Upload Files Demo</title> </head> <body> <form enctype="multipart/form-data" action="/upload" method="post"> <input type="file" name="upload-file" multiple="multiple"/> <input type="submit" value="upload" /> </form> </body> </html> `) } func main() { s := g.Server() s.Group("/upload", func(group *ghttp.RouterGroup) { group.POST("/", Upload) group.ALL("/show", UploadShow) group.ALL("/batch", UploadShowBatch) }) s.SetPort(8080) s.Run() }
uploadFiles
类型是一个切片,并且可以看看其中的Save
方法,实现了单个文件以及多个文件的保存.
客户端
客户端上传文件就只需要使用ghttp.Post()
,其中参数为属性名=@file:路径
设置Cookie\Header\Proxy
已经全部封装在对应的Setxxx
方法中,自己根据需要修改设置内容就好
打印请求信息
http
客户端支持对HTTP请求的输入与输出原始信息获取与打印,方便调试,相关方法如下:
func (r *Response) Raw() string func (r *Response) RawDump() func (r *Response) RawRequest() string func (r *Response) RawResponse() string