GoFrame第四天

2024-01-11 03:10
文章标签 第四天 goframe

本文主要是介绍GoFrame第四天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • GoFrame day4
    • 前言
    • HTTPClient
      • 链式操作
      • 基本使用
      • 文件上传
        • 上传服务端
        • 客户端
      • 设置Cookie\Header\Proxy
      • 打印请求信息

GoFrame day4

前言

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

HTTPClient

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

image-20220608082337208

这里的gclient其实也是封装了http.Client,客户端同样提供了一系列的请求方法,但是请求结果对象在使用完毕后需要用Close()关闭

链式操作

GoFrame的客户端支持链式操作,也就是多个方法可以链式调用

这个地方大家可以去看看官网中的例子

基本使用

简单的使用客户端请求的例子

package mainimport ("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-20220608092836546

image-20220608092904486

为了测试客户端post请求,先写一个简单的服务

package mainimport ("github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/ghttp"
)type RegisterReq struct {Name  stringPass  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 *RegisterReqif 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-20220608095115501

文件上传

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

上传服务端
package mainimport ("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-20220608115754167

image-20220608123506681

image-20220608133732490

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

这篇关于GoFrame第四天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592953

相关文章

【JAVA】第四天

JAVA第四天 一、Object类二、Objects类三、包装类四、字符串修改 一、Object类 表格: 方法名作用public String toString()返回对象的字符串表示形式public boolean equals(Object o)判断两个对象是否相等protected Object clone​()对象克隆 注意 toString() 和 equals(

【60天备战软考高级系统架构设计师——第四天:需求获取与初步分析】

软件开发的成功与否往往取决于需求分析的准确性和全面性。今天,我们将深入学习需求获取的各种方法及初步分析的策略,为构建成功的软件项目打下坚实基础。 需求获取方法 需求获取是软件工程中非常重要的阶段,它帮助开发团队深入了解用户的需求和期望。常见的需求获取方法包括: 访谈 优点:直接与用户交流,能够深入了解需求。缺点:耗时,可能导致需求过于详细或不一致。 问卷调查 优点:可以快速收集大量用户的

数据结构与算法 第四天(串、数组、广义表)

串(String) 任意字符组成的有限序列 串的类型定义 串的顺序存储结构 模式匹配算法 确定主串所含字串第一次出现的位置。 BF算法 穷举法,从每个字符开始依次匹配 KMP算法 链式存储 数组 基本操作 特殊矩阵存储 对称矩阵 三角矩阵 对角矩阵 稀疏矩阵 超过95%元素为零 三元组法 十字链表

数据结构-递归算法-第四天

参考文献: 华为云 博客园 labuladong 的算法笔记 递归是一种编程技巧,一种解决问题的思维方式;分治算法和动态规划很大程度上是递归思想基础上的(虽然动态规划的最终版本大都不是递归了,但解题思想还是离不开递归),解决更具体问题的两类算法思想;贪心算法是动态规划算法的一个子集,可以更高效解决一部分更特殊的问题。 在数学与计算机科学中,递归 (Recursion)是指在函数的定义中使用

数据结构-堆(二叉树的特殊)-第四天

数据结构的“堆”与内存管理的“堆”是同一个概念吗? 两者不是同一个概念,只是碰巧都叫“堆”。计算机系统内存中的堆是动态内存分配的一部分,程序在运行时可以使用它来存储数据。程序可以请求一定量的堆内存,用于存储如对象和数组等复杂结构。当这些数据不再需要时,程序需要释放这些内存,以防止内存泄漏。相较于栈内存,堆内存的管理和使用需要更谨慎,使用不当可能会导致内存泄漏和野指针等问题。 参考文献 定义

项目训练营第四天

项目训练营第四天 前端部分修改 前端用的是WebStorm和Ant Design Pro框架 Ant Design Pro是比较流行的一个前端登陆、注册、管理框架,能帮我们快速实现前端界面的开发 效果大致如图 使用起来也极为方便,首先在WebStorm 控制台中输入如下命令 # 使用 npmnpm i @ant-design/pro-cli -gpro create mya

【昇思25天学习打卡营打卡指南-第四天】数据变换 Transforms

数据变换 Transforms 通常情况下,直接加载的原始数据并不能直接送入神经网络进行训练,此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换(Transforms),配合数据处理Pipeline来实现数据预处理。所有的Transforms均可通过map方法传入,实现对指定数据列的处理。 mindspore.dataset提供了面向图像、文本、音频等不同数据类型的Tra

goframe目录文件解析

goframe 目录分块 ├─api ├─hack ├─internal │ ├─cmd │ ├─consts │ ├─controller │ ├─dao │ ├─logic │ ├─model │ │ ├─do │ │ └─entity │ ├─packed │ └─service ├─manifest │ ├─config │ ├─deploy │ │ └─kustomize │ │ ├─

C++作业第四天

#include <iostream>   using namespace std;   class Per { private:     string name;     int age;     int *high;     double *weight; public:     //构造函数     Per()     {         cout << "Per的无参构造" << endl

Spring Boot 系统学习第四天:Spring循环依赖案例分析 备份

1 概述         在前面介绍三种不同的依赖注入类型时,引出了使用Spring IoC容器时一个常见问题,即循环依赖。同时也明确了在单例作用域下,Setter方法注入能够解决循环依赖问题,而构造器注入则不能。对于单例作用域来说,Spring容器在整个生命周期内,有且只有一个Bean对象,所以很容易想到这个对象应该存在于缓存中。Spring为了解决单例Bean的循环依赖问题,使用了三级缓存