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


目录
相关文章
|
5月前
|
关系型数据库 MySQL Java
“惊呆了!无需改动Nacos源码,轻松实现SGJDBC连接MySQL?这操作太秀了,速来围观,错过等哭!”
【8月更文挑战第7天】在使用Nacos进行服务治理时,常需连接MySQL存储数据。使用特定的SGJDBC驱动连接MySQL时,一般无需修改Nacos源码。需确保SGJDBC已添加至类路径,并在Nacos配置文件中指定使用SGJDBC的JDBC URL。示例中展示如何配置Nacos使用MySQL及SGJDBC,并在应用中通过Nacos API获取配置信息建立数据库连接,实现灵活集成不同JDBC驱动的目标。
160 0
|
8月前
|
关系型数据库 MySQL
Mysql基础第四天,Mysql数据类型
Mysql基础第四天,Mysql数据类型
46 0
Mysql基础第四天,Mysql数据类型
|
8月前
|
人工智能
介绍几个有趣的网站(二十八)
介绍几个有趣的网站(二十八)
129 2
如何设计一个超牛逼的本地缓存,太香了
最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存;一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能;当然如果拿来和专门的缓存框架如ehcache来对比可能稍有差距;本文我们将来整理一下实现一个本地缓存都应该需要考虑哪些东西。
|
存储 NoSQL Java
GoFrame避坑指南和实践干货(2)
用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河
237 0
GoFrame避坑指南和实践干货(2)
|
数据库 数据格式 索引
GoFrame garray使用实践
今天在搞一个需求,从三方获得有信息变更的商品,更新自己的数据库,再推送给下游进行商品更新。
118 0
GoFrame garray使用实践
|
安全 NoSQL 数据库连接
GoFrame第五天
GoFrame第五天
252 0
GoFrame第五天
|
中间件 API
GoFrame第三天
GoFrame第三天
241 0
GoFrame第三天
|
缓存 中间件 API
GoFrame第二天
GoFrame第二天
322 0
GoFrame第二天
|
JavaScript 程序员 开发者
Faker.js 作者“删库跑路”引开源圈“震动”:该开源项目现已被社区控制
Faker.js 作者“删库跑路”引开源圈“震动”:该开源项目现已被社区控制
159 0
Faker.js 作者“删库跑路”引开源圈“震动”:该开源项目现已被社区控制