返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言HTTPServer开发的六种方式小结
  • 505
分享到

Go语言HTTPServer开发的六种方式小结

2024-04-02 19:04:59 505人浏览 泡泡鱼
摘要

目录第一种 第二种 第三种 第四种 第五种 第六种 学完了​​net/Http​​和​​fasthttp

学完了​​net/Http​​和​​fasthttp​​两个HTTP协议接口的客户端实现,接下来就要开始Server的开发,不学不知道一学吓一跳,居然这两个库还支持Server的开发,太方便了。相比于Java的httpserver开发基本上都是使用spring或者SpringBoot框架,总是要配置各种配置类,各种​handle​​对象。golang的Server开发显得非常简单,就是因为特别简单,或者说没有形成特别统一的规范或者框架,我发现了很多实现方式,HTTP协议基于还是​​net/http​​和​​fasthttp​​,但是​​handle​​语法就多种多样了。

先复习一下:Golang语言HTTP客户端实践​​、Golang fasthttp实践​​。 在Golang语言方面,实现某个功能的库可能会比较多,有机会还是要多跟同行交流,指不定就发现了更好用的库。下面我分享我学到的六种Server开发的实现Demo。

第一种

基于​​net/http​​实现,这是一种比较基础的,对于接口和​​handle​​映射关系处理并不优雅,不推荐使用。


func TestHttpSer(t *testing.T) {
  server := http.Server{
  Addr: ":8001",
  Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if strings.Index(r.URL.String(), "test") > 0 {
    fmt.Fprintf(w, "这是net/http创建的server第一种方式")
    return
    }
    fmt.Fprintf(w, task.FunTester)
    return
  }),
  }
  server.ListenAndServe()
  log.Println("开始创建HTTP服务")
}

第二种

第二种也是基于​​net/http​​,这种编写语法可以很好地解决第一种的问题,handle和path有了类似配置的语法,可读性提高了很多。


type indexHandler struct {
  content string
}


func (ih *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, ih.content)
}


func TestHttpSer2(t *testing.T) {
  http.Handle("/test", &indexHandler{content: "这是net/http第二种创建服务语法"})
  http.Handle("/", &indexHandler{content: task.FunTester})
  http.ListenAndServe(":8001", nil)
}

第三种

第三个基于​​net/http​​和​​GitHub.com/labstack/echo​​,后者主要提供了​​Echo​​对象用来处理各类配置包括接口和handle映射,功能很丰富,可读性最佳。


func TestHttpSer3(t *testing.T) {
  app := echo.New()
  app.Use(middleware.CORSWithConfig(middleware.CORSConfig{
  AllowOrigins: []string{"*"},
  AllowMethods: []string{echo.GET, echo.DELETE, echo.POST, echo.OPTioNS, echo.PUT, echo.HEAD},
  AllowHeaders: []string{echo.HeaderContentType, echo.HeaderAuthorization},
  }))
  app.Group("/test")
  {
  projectGroup := app.Group("/test")
  projectGroup.GET("/", PropertyAddHandler)
  }
  app.Server.Addr = ":8001"
  gracehttp.Serve(app.Server)
}

第四种

第四种依然基于​​net/http​​实现,引入了​​github.com/gin-gonic/gin​​的路由,看起来接口和​​handle​​映射关系比较明晰了。


func TestHttpServer4(t *testing.T) {
  router := gin.New()

  api := router.Group("/okreplay/api")
  {
  api.POST("/submit", gin.HandlerFunc(func(context *gin.Context) {
    context.ShouldBindJSON(map[string]interface{}{
    "code": 0,
    "msg":  "这是创建HTTPServer第四种方式",
    })
    context.Status(200)
  }))
  }
  s := &http.Server{
  Addr:           ":8001",
  Handler:        router,
  ReadTimeout:    1000 * time.Second,
  WriteTimeout:   1000 * time.Second,
  MaxHeaderBytes: 1 << 20,
  }
  s.ListenAndServe()
}

第五种

第五种基于​​fasthttp​​开发,使用都是​​fasthttp​​提供的API,可读性尚可,handle配置倒是更像Java了。


func TestFastSer(t *testing.T) {
  address := ":8001"
  handler := func(ctx *fasthttp.RequestCtx) {
  path := string(ctx.Path())
  switch path {
  case "/test":
    ctx.SetBody([]byte("这是fasthttp创建服务的第一种语法"))
  default:
    ctx.SetBody([]byte(task.FunTester))
  }
  }
  s := &fasthttp.Server{
  Handler: handler,
  Name:    "FunTester server",
  }
  if err := s.ListenAndServe(address); err != nil {
  log.Fatal("error in ListenAndServe", err.Error())
  }
}

第六种

第六种依然基于​​fasthttp​​,用到了​​github.com/buaazp/fasthttprouter​​,有点奇怪两个居然不在一个GitHub仓库里。使用语法跟第三种方式有点类似,比较有条理,有利于阅读。


func TestFastSer2(t *testing.T) {
  address := ":8001"


  router := fasthttprouter.New()
  router.GET("/test", func(ctx *fasthttp.RequestCtx) {
  ctx.Response.SetBody([]byte("这是fasthttp创建server的第二种语法"))
  })
  router.GET("/", func(ctx *fasthttp.RequestCtx) {
  ctx.Response.SetBody([]byte(task.FunTester))
  })
  fasthttp.ListenAndServe(address, router.Handler)
}

到此这篇关于Go语言HTTPServer开发的六种实现小结的文章就介绍到这了,更多相关Go HTTPServer 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言HTTPServer开发的六种方式小结

本文链接: https://lsjlt.com/news/156308.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言HTTPServer开发的六种方式小结
    目录第一种 第二种 第三种 第四种 第五种 第六种 学完了​​net/http​​和​​fasthttp...
    99+
    2024-04-02
  • Go语言HTTPServer开发的有那几种方式
    这篇文章主要介绍“Go语言HTTPServer开发的有那几种方式”,在日常操作中,相信很多人在Go语言HTTPServer开发的有那几种方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言HTTPSer...
    99+
    2023-06-25
  • go语言中五种字符串的拼接方式(小结)
    目录+拼接方式sprintf函数Join函数buffer.Builderbuffer.WriteString函数buffer.Builder函数ps:直接使用运算符主要结论+拼...
    99+
    2022-06-07
    小结 GO 字符串 go语言 字符
  • go语言结构体赋值的方式有哪几种
    在Go语言中,结构体赋值的方式有以下几种: 直接赋值:可以直接通过"."操作符给结构体的字段赋值。 type...
    99+
    2024-02-29
    go语言
  • Android View移动的六种方法小结
    在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。 layout() 如果你将滑动后的...
    99+
    2022-06-06
    小结 view 方法 Android
  • Go语言读取文本文件的三种方式总结
    目录1 逐行读取文本文件2 逐个单词读取文本文件测试代码3 逐个字符读取文本文件总结工作中时不时需要读取文本,文本文件是最常见的文件类型。 本文将从逐行、逐个单词和逐个字符三个方法读...
    99+
    2023-01-12
    Go语言读取文本文件 Go语言读取文件 Go读取文本文件
  • R语言数据框合并(merge)的几种方式小结
    merge data frames (inner, outer, left, right) 数据 > df1 = data.frame(CustomerId = c(1:...
    99+
    2024-04-02
  • Go中数组传参的几种方式小结
    初学Golang,数组传参问题就是把我整不会了,以前我们使用c语言进行数组传参时是这样传递的,直接传递数组的起始地址即可。 而在go中数组传参我们以以下两种方式进行传递,这里我直接...
    99+
    2023-03-08
    Go 数组传参
  • Java 实现并发的几种方式小结
    Java实现并发的几种方法 Java程序默认以单线程方式运行。 synchronized Java 用过synchronized 关键字来保证一次只有一个线程在执行代码块。 pu...
    99+
    2024-04-02
  • Go 语言的 Shell 容器:一种新的并发编程方式?
    随着技术的进步和发展,人们对于编程语言的要求也越来越高。在这样的背景下,Go 语言应运而生。Go 语言是一种并发编程语言,它拥有更高的并发性能和更低的内存占用,可以满足现代应用开发的需求。在这篇文章中,我们将探讨一种新的并发编程方式:使用...
    99+
    2023-07-28
    shell 容器 并发
  • Go语言读取文件的四种方式
    目录前言整个文件读取按行读取逐个单词读取以数据块的形式读取文件二进制读取总结前言 这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。 os 包提供了一个...
    99+
    2023-05-15
    Go 读取文件
  • C语言怎么实现俄罗斯方块的六种模式
    这篇文章主要介绍了C语言怎么实现俄罗斯方块的六种模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最终效果主页模式选择按1进入单人模式按2进入双人模式标准模式:除了左右下移动...
    99+
    2023-06-29
  • MySQL数据库优化的六种方式总结
    目录方法一方法二方法五方法六附:mysql优化的常用方法总结方法一 使用连接来代替子查询(Sub-Queries)。可以使用SELECT语句来创建一个单列的查询结果,然后把这...
    99+
    2024-04-02
  • Qt 中开启线程的多种方式小结
    目录简介1. 继承 QThread 重写 run 函数2. 继承 QObject 调用 moveToThread3. 继承 QRunnable 重新 run 函数,结合 QThrea...
    99+
    2024-04-02
  • C语言求素数的几种方式总结
    目录一、判断n是否能被2~n-1整除方法一方法二二、判断n是否能被2~√n间的整数整除方法一方法二总结一、判断n是否能被2~n-1整除 输入的数n不能被2-(n-1)整除...
    99+
    2022-12-27
    C语言求素数 C语言素数 C语言求素数方式
  • Zuul 实现网关转发的五种方式小结
    上图为一个微服务框架的简单示例,当有一个HTTP请求发送到服务器的时候,其实是先经过了Nginx的,再经过了网关,这里的网关就担任了拦截过滤的作用,既然拦截和过滤了,肯定就涉及到了...
    99+
    2024-04-02
  • Go语言实现读取文件的方式总结
    目录前言整个文件读取按行读取逐个单词读取以数据块的形式读取文件二进制读取总结前言 这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。 os 包提供了一个...
    99+
    2023-05-14
    Go语言读取文件方式 Go语言读取文件 Go语言 文件
  • Go语言是基于什么语言开发的?
    Go语言是一种由Google开发的开源编程语言,于2007年开始开发,2009年正式发布。Go语言受到了C、Pascal和ALGOL等语言的影响,在设计上具有高效性、易用性和并发性等特...
    99+
    2024-04-02
  • Go语言开发项目经验总结与分享
    Go语言是一门由Google开发的开源编程语言,因其出色的性能和简洁的语法而受到越来越多开发者的青睐。作为一名从事软件开发多年的工程师,我最近完成了一个基于Go语言的项目,积累了一些开发经验和心得,现在与大家分享。首先,我想谈谈为什么选择G...
    99+
    2023-11-04
    项目经验总结 Go语言开发经验 分享经验
  • pythondf遍历的N种方式(小结)
    目录for…in 迭代循环iterrows()生成器方式apply()循环方式矢量化遍历方式总结for…in 迭代循环 首先介绍Python中最常用的fo...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作