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月前
|
消息中间件 安全 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
90 0
|
2月前
|
JSON 数据格式
【Axure高手秘籍】掌握这招,让你的原型设计效率飙升!——元件库导入与使用教程及主流资源下载全解析
【8月更文挑战第20天】Axure RP是界面设计与交互原型制作的强大工具。掌握元件库能显著提升设计效率。元件库包含预设UI元素如按钮、表单等,可直接拖放构建布局。在Axure RP中,通过“元件”选项下的“库”可访问并导入新元件库。导入后,轻松拖放元件至画布调整,甚至自定义样式和交互。利用脚本还能模拟真实交互效果,如按钮点击反馈。推荐资源包括Axure Marketplace、UIZilla等,助力高效设计。
40 0
|
4月前
|
测试技术 虚拟化 云计算
GitHub高赞!速通Python编程基础手册,被玩出花了!
随着云时代的来临,Python 语言越来越被程序开发人员喜欢和使用,因为其不仅简单易学,而且还有丰富的第三方程序库和相应完善的管理工具。 从命令行脚本程序到 GUI程序,从图形技术到科学计算,从软件开发到自动化测试,从云计算到虚拟化,所有这些领域都有 Python 的身影。 今天给小伙伴们分享的这份手册采用以任务为导向的编写模式,全面地介绍了 Python 编程基础及其相关知识的应用,讲解了如何利用 Python 的知识解决部分实际问题。
GitHub高赞!速通Python编程基础手册,被玩出花了!
|
11月前
|
C++
《C++避坑神器·二十一》回调函数使用
《C++避坑神器·二十一》回调函数使用
82 0
|
SQL 前端开发 Java
【五一创作】基于springboot框架的电脑商城项目(三)(1)
个人资料 (一)个人资料(持久层) 1.规划sql 根据用户id修改信息的SQL语句
|
前端开发 网络协议 jenkins
三分钟,我让搞后端的学弟爱上了Eolink
突然某一天,一个特别能卷的学弟向我请教接口工具……
三分钟,我让搞后端的学弟爱上了Eolink
|
开发工具 git
如何使用TortoiseGit指北,一篇讲清(下)
如何使用TortoiseGit指北,一篇讲清(下)
如何使用TortoiseGit指北,一篇讲清(下)
|
数据可视化 开发工具 git
|
存储 NoSQL Java
GoFrame避坑指南和实践干货(2)
用GoFrame已经开发了一段时间,今天为大家分享避坑指南和实践干货。这些坑并不是框架设计者的问题,更多的是我作为初学者的各种摸石头过河
203 0
GoFrame避坑指南和实践干货(2)
|
数据库 数据格式 索引
GoFrame garray使用实践
今天在搞一个需求,从三方获得有信息变更的商品,更新自己的数据库,再推送给下游进行商品更新。
102 0
GoFrame garray使用实践
下一篇
无影云桌面