热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go语言从入门到精通【web项目实战篇】搭建Web服务器

Go语言从入门到精通-【web项目实战篇】-搭建Web服务器,Go语言社区,Golang程序员人脉社

本节核心内容
  • 介绍使用net/http包创建HTTP服务

  • 介绍使用net/http包建立Web服务器

  • 介绍Gin框架

本小节视频教程和代码:百度网盘;密码6ejd

可先下载视频和源码到本地,边看视频边结合源码理解后续内容,边学边练。

想查看Gin源码的朋友可自行查看Gin框架官方地址



搭建一个简单的Web服务器

Go语言标准库 - net/http


这里给大家提供一个学习Go语言的一个很好的起点,Go语言官方文档,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方提供的标准库 net/http,通过http包提供了HTTP客户端和服务端的实现。同时使用这个包能很简单地对web的路由,静态文件,模版,COOKIE等数据进行设置和操作。如果对http概念不是太清楚的朋友可以自行google。我们先来看一个原生的net/http请求的例子:


创建HTTP服务

package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
//生成client 参数为默认
client := &http.Client{}
//生成要访问的url
url := "http://www.baidu.com"
//提交请求
reqest, err := http.NewRequest("GET", url, nil)
if err != nil {
panic(err)
}
//处理返回结果
response, _ := client.Do(reqest)
//将结果定位到标准输出 也可以直接打印出来 或者定位到其他地方进行相应的处理
stdout := os.Stdout
_, err = io.Copy(stdout, response.Body)
//返回的状态码
status := response.StatusCode
fmt.Println(status)
}

上面代码实现了一个简单的页面请求,我们可以用这种方式去请求一些网址,已获得响应,从而对响应数据进行处理,但这种方式很少见,我们先了解即可,下面我们看一下怎样用http包建立一个web服务器。


http包建立Web服务器

package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析参数,默认是不会解析的
fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello Wrold!") //这个写入到w的是输出到客户端的
}
func main() {
http.HandleFunc("/", sayhelloName) //设置访问的路由
err := http.ListenAndServe("127.0.0.1:9090", nil) //设置要监听的Ip和端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

页面输出:


Hello Wrold!


运行结果:

map[]
path /
scheme
[]
map[]
path /favicon.ico
scheme
[]

可以看到在没有传参时,控制台打印的数据都为空,接下来演示一下传入参数后的结果:

添加参数:


localhost:9090/?url_lOng=111&url_lOng=222


运行结果:

map[url_long:[111 222]]
path /
scheme
[111 222]
key: url_long
val: 111222
map[]
path /favicon.ico
scheme
[]

我们看到了上面的代码,要编写一个Web服务器是不是很简单,只要调用http包的两个函数就可以了。

我们看到Go通过简单的几行代码就已经运行起来一个Web服务了,而且这个Web服务内部有支持高并发的特性。我们现在知道了原来创建一个http服务,大致只需要经历两个过程


  • 注册路由


    提供url模式和handler函数的映射,并实例化一个server对象,并开启对客户端的监听。



http.HandleFunc("/", sayhelloName)

  • 设定要监听的IP和端口。

http.ListenAndServe("127.0.0.1:9090", nil)

是不是很简单?赶紧自己动手试试吧。


Gin框架

在学习了前面的内容,我们来了解一个框架Gin,Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等特点。该官网的说法是它具有更好的性能,有多好呢?据说是速度提升了40倍,所以这也是我们今后开发中主要使用的一个框架。

代码示例:

package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func Login(c *gin.Context) {
fmt.Fprintf(c.Writer,"Welcome index!")
}
func main() {
router := gin.Default()
router.GET("/",Login)
router.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
router.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})
router.POST("/your/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})
router.Run(":8080")
}

页面返回结果:

Welcome index!

请求参数:


http://localhost:8080/user/name:jeck/18


页面返回结果:

name:jeck is /18

使用Get请求Post路径:


http://localhost:8080/your/name:Lucy/21


image


小结

本小节主要给大家演示了分别基于Http的请求,和基于Http包以及Gin框架的web服务,其中首推Gin框架,因为它有着更高的效率


转载于:https://www.cnblogs.com/Survivalist/articles/10429518.html



推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
author-avatar
k婷妈咪1_1997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有