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


目录
相关文章
|
JSON JavaScript 前端开发
在Python中调用和执行JavaScript
在Python中调用和执行JavaScript主要通过`PyExecJS`库实现。安装库后,可以使用`execjs.compile`编译JS代码并用`eval`或`call`执行。此外,还能加载JavaScript库和框架,调用外部JS文件,处理返回值,以及在两者间传递数据。Python和JavaScript各有优劣,适用于不同场景,结合使用可增强项目功能和灵活性。
1529 0
|
关系型数据库 MySQL Docker
docker pull mysql:8.0.26提示Error response from daemon: Get “https://registry-1.docker.io/v2/“: EOF错误
docker pull mysql:8.0.26提示Error response from daemon: Get “https://registry-1.docker.io/v2/“: EOF错误
4738 9
|
Web App开发 缓存 前端开发
【Github】玩转Github系列之三——史上最全Github加速手段
【Github】玩转Github系列之三——史上最全Github加速手段
4466 0
【Github】玩转Github系列之三——史上最全Github加速手段
|
JavaScript 内存技术
nvm 切换版本失效?这个方法100%解决
NVM是一个工具,类似于一个“开关”,可以帮助我们在同一台电脑上安装和切换不同版本的Node.js
9424 1
nvm 切换版本失效?这个方法100%解决
|
小程序 Android开发 iOS开发
微信小程序设置为体验版需要打开调试模式
微信小程序设置为体验版需要打开调试模式
微信小程序设置为体验版需要打开调试模式
|
搜索推荐 编译器 C++
指针进阶:函数指针 && 回调函数(真正理解qsort)
指针进阶:函数指针 && 回调函数(真正理解qsort)
129 0
干货:下载神器IDM与某度网盘不限速教程(实用)
上回说到了IDM软件的安装既简单用法,今天就带大家来学习一些它的一些特殊用法,希望大家喜欢,下载某度盘资源(无限速)
5564 0
干货:下载神器IDM与某度网盘不限速教程(实用)
|
Web App开发 JSON 网络协议
简单的 HTTP 服务器搭建 | 学习笔记
快速学习简单的 HTTP 服务器搭建,介绍了简单的 HTTP 服务器搭建系统机制, 以及在实际应用过程中如何使用。
简单的 HTTP 服务器搭建 | 学习笔记
|
机器学习/深度学习 算法 计算机视觉
CV之DNN:基于OpenPose的OpenCV利用DNN算法实现对单人体姿态(詹姆斯扣篮+美女跳舞)实时估计检测
CV之DNN:基于OpenPose的OpenCV利用DNN算法实现对单人体姿态(詹姆斯扣篮+美女跳舞)实时估计检测
CV之DNN:基于OpenPose的OpenCV利用DNN算法实现对单人体姿态(詹姆斯扣篮+美女跳舞)实时估计检测
|
监控 网络协议 Linux
云网络二三事 - GNU类工具
老实说,最开始排查网络问题,接触到的命令就是ping,当时也只是对ping有一个非常粗浅的理解,知道他可以探测本地到目标的链路是否是否正常,再往后就知道了traceroute和mtr,感叹网络的大佬们真的将三层、四层协议用的是淋漓尽致,很好的利用了ICMP、IP协议的各个字段,非常巧妙的实现了“窥一斑而知全豹”的能力,下面的内容,部分可能非常老套,但我建议大家可以一并参考一下,虽然这些工具都是老生常谈了,但每次碰到疑难问题去研究他们的实现时,都可以获得新的感悟。
370 0