Golang详细讲解常用Http库及Gin框架的应用

目录
  • 1. Http标准库
    • 1.1 http客户端
    • 1.2 自定义请求头
    • 1.3 检查请求重定向
    • 1.4 http服务器性能分析
  • 2. JSON数据处理
    • 2.1 实体序列化
    • 2.2 处理字段为小写下划线
    • 2.3 省略空字段
    • 2.4 反序列化
  • 3. 自然语言处理
    • 3.1 使用Map处理
    • 3.2 定义实体处理
  • 4. http框架
    • 4.1 gin
      • 4.1.1 启动服务
      • 4.1.2 middleware
      • 4.1.3 设置请求ID

1. Http标准库

1.1 http客户端

func main() {
	response, err := http.Get("https://www.imooc.com")
	if err != nil {
		return
	}
	defer response.Body.Close()
	bytes, err := httputil.DumpResponse(response, true)
	if err != nil {
		return
	}
	fmt.Printf("%s", bytes)
}

1.2 自定义请求头

func main() {
	request, err := http.NewRequest(http.MethodGet, "https://www.imooc.com", nil)
	if err != nil {
		return
	}
	//自定义请求头
	request.Header.Add("header", "value")
	response, err := http.DefaultClient.Do(request)
	if err != nil {
		return
	}
	defer response.Body.Close()
	bytes, err := httputil.DumpResponse(response, true)
	if err != nil {
		return
	}
	fmt.Printf("%s", bytes)
}

1.3 检查请求重定向

//检查重定向函数
	client := http.Client{CheckRedirect: func(req *http.Request, via []*http.Request) error {
		// via: 所有重定向的路径
		// req: 当前重定向的路径
		return nil
	}}
	response, err := client.Do(request)
	if err != nil {
		return
	}

1.4 http服务器性能分析

图形界面的使用需要安装 graphviz

导入 :_ “net/http/pprof” , 下划线代表只使用其中的依赖,不加就会编译报错

访问:/debug/pprof

使用:

  • go tool pprof http://localhost:8888/debug/pprof/profile 可以查看30秒的cpu使用率
  • go tool pprof http://localhost:6060/debug/pprof/block 查看gorountine阻塞配置文件

2. JSON数据处理

2.1 实体序列化

type Order struct {
	ID string
	Name string
	Quantity int
	TotalPrice float64
}
func main() {
	o := Order{ID: "1234", Name: "learn go", Quantity: 3, TotalPrice: 30.0}
	fmt.Printf("%+v\n", o)
	//序列化后的字节切片,
	bytes, err := json.Marshal(o)
	if err != nil {
		return
	}
	fmt.Printf("%s\n", bytes)
}

注意:首写字母为小写,Marshal不会进行序列化

2.2 处理字段为小写下划线

使用属性标签

type Order struct {
	ID string `json:"id""`
	Name string `json:"name"`
	Quantity int `json:"quantity"`
	TotalPrice float64 `json:"total_price"`
}
func main() {
	o := Order{ID: "1234", Name: "learn go", Quantity: 3, TotalPrice: 30.0}
	fmt.Printf("%+v\n", o)
	//序列化
	bytes, err := json.Marshal(o)
	if err != nil {
		return
	}
	fmt.Printf("%s\n", bytes)
}

2.3 省略空字段

在字段上添加 omitempty 可以省略空字的字段

type Order struct {
	ID string `json:"id""`
	Name string `json:"name,omitempty"`
	Quantity int `json:"quantity"`
	TotalPrice float64 `json:"total_price"`
}

2.4 反序列化

func main() {
	//反序列化
	str := `{"id":"1234","name":"learn go","quantity":3,"total_price":30}`
	order := unmarshal[Order](str, Order{})
	fmt.Printf("%+v\n", order)
}
//使用泛型的方法,可以解析出对应的实体类
func unmarshal[T any](str string, t T) any {
	err := json.Unmarshal([]byte(str), &t)
	if err != nil {
		return nil
	}
	return t
}

3. 自然语言处理

可以调用阿里云的自然语言处理api进行数据的处理

3.1 使用Map处理

func mapUnmarshall() {
	str := `{
		"data": [
			{
				"id": 0,
				"word": "请",
				"tags": [
					"基本词-中文"
				]
			},
			{
				"id": 1,
				"word": "输入",
				"tags": [
					"基本词-中文",
					"产品类型修饰词"
				]
			},
			{
				"id": 2,
				"word": "文本",
				"tags": [
					"基本词-中文",
					"产品类型修饰词"
				]
			}
		]
	  }`
	//map存储数据都使用interface来存储
	m := make(map[string]any)
	err := json.Unmarshal([]byte(str), &m)
	if err != nil {
		return
	}
	//如果需要取id为2的数据,需要指明所取的值是一个切片 使用type assertion,包括取后续的数据的时候都要指定类型
	fmt.Printf("%+v\n", m["data"].([]any)[2].(map[string]any)["tags"])
}

3.2 定义实体处理

//map存储数据都使用interface来存储
m := struct {
    Data []struct{
        Id   int32    `json:"id"`
        Word string   `json:"word"`
        Tags []string `json:"tags"`
    } `json:"data"`
}{}
err := json.Unmarshal([]byte(str), &m)
if err != nil {
    return
}
fmt.Printf("%+v\n", m.Data[2].Tags)

4. http框架

4.1 gin

下载依赖:go get -u github.com/gin-gonic/gin、go get -u go.uber.org/zap (日志库)

4.1.1 启动服务

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

4.1.2 middleware

Context 结构体其中包含了请求相关的信息

可以为web服务添加 “拦截器” ,添加 middleware 拦截请求打印自己需要的日志

logger, _ := zap.NewProduction()
r.Use(printRequestLog, printHello)
//如果添加多个,先定义上方法,直接添加即可
func printRequestLog(c *gin.Context) {
	logger.Info("Incoming request", zap.String("path", c.Request.URL.Path))
	//放行,如果不释放,后续就不能进行处理
	c.Next()
    //获取到response对象
	logger.Info("处理状态:", zap.Int("status", c.Writer.Status()))
}
func printHello(c *gin.Context) {
	fmt.Println("hello:", c.Request.URL.Path)
	//放行,如果不释放,后续就不能进行处理
	c.Next()
}

4.1.3 设置请求ID

func setRequestId(c *gin.Context) {
	c.Set("requestId", rand.Int())
	c.Next()
}

到此这篇关于Golang详细讲解常用Http库及Gin框架的应用的文章就介绍到这了,更多相关Golang Http库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang gin框架获取参数的操作

    1.获取URL参数 GET请求参数通过URL传递 URL参数可以通过DefaultQuery()或Query()方法获取 DefaultQuery()若参数不存在,返回默认值,Query()若参数不存在,返回空串 user_id := com.StrTo(ctx.Query("user_id")).MustInt64() page := com.StrTo(ctx.DefaultQuery("page", "1")).MustInt() 2.获取

  • 浅谈golang fasthttp踩坑经验

    一个简单的系统,结构如下: 我们的服务A接受外部的http请求,然后通过golang的fasthttp将请求转发给服务B,流程非常简单.线上运行一段时间之后,发现服务B完全不再接收任何请求,查看服务A的日志,发现大量的如下错误 从错误原因看是因为连接被占满导致的.进入服务A的容器中(服务A和服务B都是通过docker启动的),通过netstat -anlp查看,发现有大量的tpc连接,处于ESTABLISH.我们采用的是长连接的方式,此时心里非常疑惑:1. fasthttp是能够复用连接的,为什

  • 详解Golang语言HTTP客户端实践

    目录 HTTP客户端封装 测试脚本 测试服务 最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing.跟我之前学习Java的经验高度契合.在前一段时间学习洼坑中挣扎了好几天,差点就忘记这个重要的成功经验. 那么那什么来做练习呢?当然结合当下的工作啦,所以我列了一个路线给自己,那就是从接口测试开始学起来,从功能测试到性能测试,然后掌握基本Server开发技能. 首先,得先把HTTP接口测试常用的几个功能实现了,主要是获取HTTPrequest对象,发送

  • golang中gin框架接入jwt使用token验证身份

    目录 jwt 流程: 1.这里使用开源的 jwt-go 1.token 工具类 2. 使用该中间件 3. controller部分代码 jwt jwt的原理和session有点相像,其目的是为了解决rest api中无状态性 因为rest接口,需要权限校验.但是又不能每个请求都把用户名密码传入,因此产生了这个token的方法 流程: 用户访问auth接口,获取token 服务器校验用户传入的用户名密码等信息,确认无误后,产生一个token.这个token其实是类似于map的数据结构(jwt数据结

  • Golang Gin框架实现文件下载功能的示例代码

    目录 Layui框架实现文件上传 Gin框架获取前端上传的文件 Gin框架的文件下载 Layui框架实现文件上传 基本的思路就是随便创建一个元素,然后使用layui的upload组件对创建的元素进行渲染,详见代码 <!DOCTYPE html> <html lang="en"> <head> <script src="jquery-3.5.0.min.js" type="text/javascript"&

  • Golang请求fasthttp实践

    目录 基础API演示 高性能API演示 测试服务 Golang单元测试 测试报告 原计划学完Golang语言HTTP客户端实践之后,就可以继续了,没想到才疏学浅,在搜资料的时候发现除了Golang SDK自带的net/http,还有一个更牛的HttpClient实现github.com/valyala/fasthttp,据说性能是net/http的10倍,我想可能是有点夸张了,后期我会进行测试,以正视听. 在github.com/valyala/fasthttp用到了对象池,为了在高性能测试中减

  • golang gin 框架 异步同步 goroutine 并发操作

    goroutine机制可以方便地实现异步处理 package main import ( "log" "time" "github.com/gin-gonic/gin" ) func main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // 1.异步 r.GET("/long_async", func(c *gin.Context) {

  • golang 网络框架之gin的使用方法

    golang 原生 http 库已经可以很方便地实现一个 http server 了,但对于复杂的 web 服务来说,路由解析,请求参数解析,对象返回等等,原生 api 就显得有些不太够用了,而 gin 是一个功能完备,性能很高的 web 网络框架,特别适合 web api 的开发 hello world package main import "github.com/gin-gonic/gin" func main() { r := gin.New() r.GET("/pi

  • golang构建HTTP服务的实现步骤

    目录 HTTP Handler ServeMux Server 创建HTTP服务 http注册路由 开启监听 处理请求 参考:    一个go最简单的Http服务器程序 package main import ( "fmt" "net/http" ) func IndexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello world") } func m

  • Golang详细讲解常用Http库及Gin框架的应用

    目录 1. Http标准库 1.1 http客户端 1.2 自定义请求头 1.3 检查请求重定向 1.4 http服务器性能分析 2. JSON数据处理 2.1 实体序列化 2.2 处理字段为小写下划线 2.3 省略空字段 2.4 反序列化 3. 自然语言处理 3.1 使用Map处理 3.2 定义实体处理 4. http框架 4.1 gin 4.1.1 启动服务 4.1.2 middleware 4.1.3 设置请求ID 1. Http标准库 1.1 http客户端 func main() {

  • C++详细讲解常用math函数的用法

    目录 1.fabs(double x) 2.floor(double x)ceil(double x) 3.pow(double x,double n) 4.sqrt(double x) 5.log(double x) 6.sin(double x)cos(double x) tan(double x) 7.round(double x) 包含头文件 #include<cmath> 1.fabs(double x) 对double型变量取绝对值 #include<iostream>

  • C语言详细讲解常用字符串处理函数

    目录 一.strlen() 1. 函数原型: 2. 手动实现: 二.strcat() 1. 函数原型: 2. 手动实现: 三.strcpy() 1. 函数原型: 2. 手动实现: 四.strcmp() 1. 函数原型: 2. 手动实现: 五.memset() 1. 函数原型: 2. 手动实现: 一.strlen() 1. 函数原型: size_t strlen(const char *str) 参数str: 要计算的字符串的长度返回值: 返回字符串 str 的长度,直到遇到结束字符'\0',但不

  • C++超详细讲解标准库

    目录 一.有趣的重载 二.C++ 标准库 三.小结 一.有趣的重载 操作符 << 的原生意义是按位左移,例:1 <<2; 其意义是将整数 1 按位左移2位,即:0000 0001 → 0000 0100 现在来尝试一下重载左移操作符,将变量或常量左移到一个对象中! #include <stdio.h> const char endl = '\n'; class Console { public: Console& operator << (int i

  • Python详细讲解图像处理的而两种库OpenCV和Pillow

    目录 一.简介 1.1 图像处理-OpenCV 1.2 图像处理- PIL和Pillow 二. 常用图像类型 2.1 二值图像 2.2 灰度图像 2.3 RGB图像 2.4 常用颜色空间简介 三.OpenCV图像读写与显示 3.1 读入图像 3.2 显示图像 3.3 写出图像 四.图像几何变换 4.1 图像平移 4.2 图像旋转 4.3 图像缩放 一.简介 实现计算机视觉任务的过程中,不可避免地需要对图像进行读写操作以及图像预处理操作,下面介绍两个常用的Python图像处理库:OpenCV和Pi

  • C++ boost thread库用法详细讲解

    目录 一.说明 二.boost::thread的几个函数 三.构造 一.说明 boost::thread的六种使用方法总结,本文初步介绍线程的函数.构造.执行的详细解释. 二.boost::thread的几个函数 函数 功能 join() 让主进程等待子线程执行完毕后再继续执行 get_id() 获得线程的 id 号 detach() 标线程就成为了守护线程,驻留后台运行 bool joinable() 是否已经启动,为 join() thread::join()是个简单暴力的方法,主线程等待子

  • GoLang RabbitMQ TTL与死信队列以及延迟队列详细讲解

    目录 TTL 死信队列 延迟队列 Go实现延迟队列 TTL TTL 全称 Time To Live(存活时间/过期时间).当消息到达存活时间后,还没有被消费,就会被自动清除.RabbitMQ可以设置两种过期时间: 对消息设置过期时间. 对整个队列(Queue)设置过期时间. 如何设置 设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期. 设置消息过期时间使用参数:expiration,单位:ms(毫秒),当该消息在队列头部时(消费时),会单独判断这

  • GoLang函数栈的使用详细讲解

    目录 函数栈帧 寄存器 函数栈帧 我们的代码会被编译成机器指令并写入到可执行文件,当程序执行时,可执行文件被加载到内存,这些机器指令会被存储到虚拟地址空间中的代码段,在代码段内部,指令是低地址向高地址堆积的.堆区存储的是需要程序员手动alloc并free的空间,需要自己来控制. 虚拟内存空间是对存储器的一层抽象,是为了更好的来管理存储器,虚拟内存和存储器之间存在映射关系. 如果在一个函数中调用了另外一个函数,编译器就会对应生成一条call指令,当call指令被执行时,就会跳转到被调用函数入口处开

  • Golang表示枚举类型的详细讲解

    枚举,是一种重要的数据类型,由一组键值对组成,通常用来在编程语言中充当常量的标识符.在主流行编程语言如 c. java 等,都有原生支持.在 go 中,大家却找不到 enum 或者其它直接用来声明枚举类型的关键字.从熟悉其它编程语言的开发者转用 go 编程,刚开始会比较难接受这种情况.其实,如果你看到如何在 go 中表示枚举类型时,可能会感受到 go 语言设计者对简洁性.问题考虑的深度,是一般资浅工程师无法比拟的. 其实,在 go 语言设计者的眼里,enum 本质是常量,为什么要多余一个关键字呢

  • Android详细讲解谷歌推出的官方二维码扫描库

    相信二维码扫描现在大家都已经不稀奇了,几乎所有的App里都会支持这个功能. 这里我要问大家一个问题,你们都是如何在自己的App中加入二维码扫描功能的呢? 相信会有一大部分朋友说,使用的是ZXing或者ZBar这种开源库. 但是不知道大家有没有思考过,二维码功能这么常见,为什么Google却没有提供一个官方的二维码扫描库呢? 反正我是没思考过.有需求,找开源,这可能已经成了很多Android开发者的常态化思维. 但令我没想到的是,官方的二维码扫描库,它真的要来了. 由于我是Google的GDE,有

随机推荐