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


目录
相关文章
|
16天前
|
移动开发 网络协议 数据格式
【VOFA+速成】半小时入门VOFA+简明教程之基础认识(一)
【VOFA+速成】半小时入门VOFA+简明教程(一)
|
3月前
|
缓存 前端开发 Linux
哇塞!NPM 缓存竟成开发拦路虎?快来掌握清空秘籍,开启前端开发逆袭之旅!
【8月更文挑战第20天】NPM是前端开发中管理依赖的关键工具。有时需清空其缓存以解决版本不一致或包损坏等问题,确保使用最新依赖。可通过命令`npm cache clean --force`强制清空全部缓存,或手动删除各系统下的缓存文件夹。注意清空缓存可能延长后续安装时间,建议事先备份依赖或确保可重新安装。正确管理缓存有助于提升开发效率。
49 1
|
3月前
|
JSON 数据可视化 数据挖掘
Ruby 数据处理与分析竟如此强大!不看后悔一辈子,快来开启数据探索之旅!
【8月更文挑战第31天】在数据驱动时代,高效处理与分析数据至关重要。作为灵活强大的编程语言,Ruby 提供了丰富的工具和方法,涵盖数据读取、清洗、分析及可视化等多个环节。借助 CSV 和 JSON 库,可轻松处理常见文件格式;利用正则表达式清洗数据;通过 NMatrix 和 Statsample 库完成复杂的数据分析任务;使用 Gruff 库将分析结果可视化。同时,合理优化代码性能,如采用高效的数据结构和算法,能进一步提升数据处理效率。遵循这些最佳实践,Ruby 将成为你数据处理与分析的强大助手。
43 0
|
12月前
Axure快速入门(完结) -终章总结
Axure快速入门(完结) -终章总结
55 0
|
存储 供应链 安全
Java开发的五条安全小贴士,助你的项目更安全
Java开发的五条安全小贴士,助你的项目更安全
|
SQL 关系型数据库 MySQL
MYSQL基础篇(1)| 青训营笔记
MYSQL基础篇(1)| 青训营笔记
99 0
MYSQL基础篇(1)| 青训营笔记
|
存储 NoSQL Java
GoFrame避坑指南和实践干货(2)
用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河
211 0
GoFrame避坑指南和实践干货(2)
|
数据库 数据格式 索引
GoFrame garray使用实践
今天在搞一个需求,从三方获得有信息变更的商品,更新自己的数据库,再推送给下游进行商品更新。
107 0
GoFrame garray使用实践
|
安全 NoSQL 数据库连接
GoFrame第五天
GoFrame第五天
238 0
GoFrame第五天
|
中间件 API
GoFrame第三天
GoFrame第三天
229 0
GoFrame第三天