GoFrame第四天

简介: GoFrame第四天

GoFrame day4


前言


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


HTTPClient


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


image.png

这里的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.png

为了测试客户端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.png


文件上传


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


上传服务端


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.png

image.png


image.png


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


目录
相关文章
|
2月前
|
消息中间件 安全 druid
GitHub昙花一现!《Spring Boot趣味实战课》神作开源几分钟被下架
今天给大家分享好书了:刘水镜老师的 《Spring Boot趣味实战课》,网上依旧是没有开源版本!小编会在文末附电子版免费下载方式。 刘水镜是谁? 十余年持续技术文章输出,CSDN博客专家。2020年《 Spring Boot趣味私房课》专栏上线,凭借风趣幽默、深入浅出的写作风格深受读者好评。 《Spring Boot趣味实战课》 内容丰富、趣味实战是本书的两大特色 涵盖 Spring MVC、MyBatis Plus、Spring DaJPA、Spring Security、Quartz等主流框架 整合MySQL. Druid、Redis、 RabbitMQ、Elastics
59 0
|
2月前
|
SpringCloudAlibaba Java Nacos
前阿里P8甩我一份内部SpringCloud笔记手册,真香
SpringCloud Alibaba 因配置灵活、迭代高速、兼容性强,近几年在受到国内不少开发者的广泛关注。其中,Sentinel 作为服务治理开源组件相当出彩,可以帮助解决很多难题,比如:秒杀限流,消息削峰填谷,集群流量控制,实时熔断等。而作为国内的Spring爱好者,最最苦恼的莫过于操作性强的进阶干货太少了!
|
2月前
|
SQL 缓存 Java
Mybatis保姆级丝滑教程(一文搞懂系列)(2)
Mybatis保姆级丝滑教程(一文搞懂系列)
184 0
|
2月前
|
SQL Java 关系型数据库
Mybatis保姆级丝滑教程(一文搞懂系列)(1)
Mybatis保姆级丝滑教程(一文搞懂系列)
284 0
|
前端开发 Java 数据库
SpringBoot日记本系统全程直播01:先把框架搞起来撒~~
SpringBoot日记本系统全程直播01:先把框架搞起来撒~~
114 0
|
SQL 前端开发 Java
【五一创作】基于springboot框架的电脑商城项目(三)(1)
个人资料 (一)个人资料(持久层) 1.规划sql 根据用户id修改信息的SQL语句
MyBatis这样用,同事直呼哇塞,堪称最佳实践
MyBatis是一款非常流行的ORM框架,相信很多小伙伴都在使用。我们经常会把它和MyBatis-Plus或者MBG一起使用,用多了之后对于其一些常规操作就不太熟悉了。最近总结了下MyBatis的实用用法和技巧,希望对大家有所帮助!
|
前端开发 Oracle 算法
卷王必备学习的MyBatis-Plus用法,不来瞧瞧吗~~
卷王必备学习的MyBatis-Plus用法,不来瞧瞧吗~~
115101 1
卷王必备学习的MyBatis-Plus用法,不来瞧瞧吗~~
|
存储 NoSQL Java
GoFrame避坑指南和实践干货(2)
用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河
174 0
GoFrame避坑指南和实践干货(2)
|
安全 NoSQL 数据库连接
GoFrame第五天
GoFrame第五天
202 0
GoFrame第五天