我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

学完了​​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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go语言HTTPServer开发的有那几种方式

这篇文章主要介绍“Go语言HTTPServer开发的有那几种方式”,在日常操作中,相信很多人在Go语言HTTPServer开发的有那几种方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言HTTPSer
2023-06-25

go语言中五种字符串的拼接方式(小结)

目录+拼接方式sprintf函数Join函数buffer.Builderbuffer.WriteString函数buffer.Builder函数ps:直接使用运算符主要结论+拼接方式这种方式是我在写golang经常用的方式,go语言用+拼接
2022-06-07

go语言结构体赋值的方式有哪几种

在Go语言中,结构体赋值的方式有以下几种:直接赋值:可以直接通过"."操作符给结构体的字段赋值。type Person struct {Name stringAge int}func main() {var p Personp.Name
go语言结构体赋值的方式有哪几种
2024-02-29

Go语言读取文本文件的三种方式总结

工作中时不时需要读取文本,文本文件是最常见的文件类型。本文将利用Go语言从逐行、逐个单词和逐个字符三个方法读取文件,感兴趣的可以了解一下
2023-01-12

Go中数组传参的几种方式小结

本文主要介绍了Go中数组传参的几种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-08

Go语言读取文件的四种方式

本文主要介绍了Go语言读取文件的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-15

C语言怎么实现俄罗斯方块的六种模式

这篇文章主要介绍了C语言怎么实现俄罗斯方块的六种模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最终效果主页模式选择按1进入单人模式按2进入双人模式标准模式:除了左右下移动
2023-06-29

C语言求素数的几种方式总结

这篇文章主要介绍了C语言求素数的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-27

Go语言实现读取文件的方式总结

这篇文章主要为大家详细介绍了Go语言实现读取文件的几个方式,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,感兴趣的小伙伴可以收藏一下
2023-05-14

突破瓶颈:Go语言项目开发的经验总结

作为一种相对新兴的编程语言,Go语言在近年来的发展中受到了越来越多的关注。特别是在项目开发方面,Go语言有着优势,因为它比其他语言更适合开发高性能、并发、分布式的系统。但是,即使使用Go语言,也会遇到项目开发中的瓶颈和挑战,因此在本文中,我
突破瓶颈:Go语言项目开发的经验总结
2023-11-02

Go语言实现关闭http请求的方式总结

面试的时候问到如何关闭http请求,一般人脱口而出的是关闭response.body,这是错误的。本文为大家整理了三个正确关闭http请求的方法,希望对大家有所帮助
2023-02-26

Go 语言在嵌入式开发中面临的限制

go 语言在嵌入式开发中受以下限制:内存开销大,因垃圾回收器占用额外内存;实时性差,垃圾回收会导致程序暂停;低级控制有限,难以与特定硬件接口。Go 语言在嵌入式开发中的限制Go 语言是一种受欢迎的通用编程语言,但它在嵌入式开发中面临一些独
Go 语言在嵌入式开发中面临的限制
2024-04-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录