GoFrame第四天

GoFrame day4

前言

上一次剩下了一个坑,那就是文件的上传部分.今天就HTTP的客户端部分进行学习总结

HTTPClient

可以使用gclient.New()创建一个客户端对象,也可以使用g.Client()方法调用创建对象(实际上也就是返回gclient.New()的对象).

image-20220608082337208

这里的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())
	}

}

image-20220608092836546

image-20220608092904486

为了测试客户端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())
	}

image-20220608095115501

文件上传

终于开始填之前的坑了,文件上传又可以分为单文件上传和多文件上传以及表单文件上传.如果我们想限定文件类型,那么就需要利用正则进行判断.

上传服务端

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()
}

image-20220608115754167

image-20220608123506681

image-20220608133732490

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

猜你喜欢

转载自blog.csdn.net/shelgi/article/details/125183511