脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - 使用Golang搭建web服务的实现步骤

使用Golang搭建web服务的实现步骤

2022-09-30 20:17周伯通的麦田 Golang

本文主要介绍了使用Golang搭建web服务的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了。

我们先看个例子:http.go

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main
 
import (
    "fmt"
    "io"
    "log"
    "net/http"
)
 
func main() {
    http.HandleFunc("/test", doRequest)      //   设置访问路由
    err := http.ListenAndServe(":8000", nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
 
func doRequest(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()       //解析url传递的参数,对于POST则解析响应包的主体(request body)
    //fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
    //fmt.Println("path", r.URL.Path)
    //fmt.Println("scheme", r.URL.Scheme)
    //for k, v := range r.Form {
    //    fmt.Println("key:", k)
    //    fmt.Println("value:", strings.Join(v, ""))
    //}
    fmt.Fprintf(w, "service start...") //这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象
 
    //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
    //query := r.URL.Query()
    var uid string // 初始化定义变量
    if r.Method == "GET" {
        uid = r.FormValue("uid")
    } else if r.Method == "POST" {
        uid = r.PostFormValue("uid")
    }
    io.WriteString(w, "uid = "+uid)
}

go run http.go命令运行程序。

之后在浏览器中输入地址:http://127.0.0.1:8000/test?uid=10086,看下结果。

使用Golang搭建web服务的实现步骤

在main函数中,我们从net/http包中调用了一个http.HandleFucn函数来注册一个处理函数

这个函数接受两个参数。第一个是字符串,这个就是进行路由匹配,我这里是/test路由。第二个参数是一个func (ResponseWriter, Request)的签名。

我们的doRequest函数就是这样的签名。下一行中的http.ListenAndServe(":8000", nil),表示监听localhost的8000端口,暂时忽略掉nil。

在doRequest函数中我们有两个参数,一个是http.ResponseWriter类型的。它类似响应流,实际上是一个接口类型。

第二个是http.Request类型,类似于HTTP 请求。我们不必使用所有的参数,如果只是简单的输出,那么我们只需要使用http.ResponseWriter,io.WriteString,将会把输出流写入数据。

我们再稍微改下,大家请注意修改的部分(这里我们只调整 main函数部分代码)

?
1
2
3
4
5
6
7
8
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/test", doRequest)
    err :=  http.ListenAndServe(":8000", mux) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

这个例子中,我们不再在函数http.ListenAndServe使用nil了。这个例子跟上面的例子其实是一样的。使用http注册hanlder 函数模式就是用的ServeMux。
我们再调整下看下更复杂的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
 
import (
    "fmt"
    "io"
    "log"
    "net/http"
)
 
var mux map[string]func(http.ResponseWriter, *http.Request)
 
func main() {
    server := http.Server{
        Addr:    ":8000",
        Handler: &doHandler{},
    }
 
    mux = make(map[string]func(http.ResponseWriter, *http.Request))
    mux["/test"] = doRequest
 
    err := server.ListenAndServe()
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
 
type doHandler struct{}
 
func (*doHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if res, ok := mux[r.URL.String()]; ok {
        res(w, r)
        return
    }
 
    io.WriteString(w, "url params: "+r.URL.String())
}
func doRequest(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()                      //解析url传递的参数,对于POST则解析响应包的主体(request body)
    fmt.Fprintf(w, "service start...") //这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象
}

使用Golang搭建web服务的实现步骤

这个例子我们没有定义ServeMux,而是使用了http.Server。都是用net/http包运行了服务器。

到此这篇关于使用Golang搭建web服务的实现步骤的文章就介绍到这了,更多相关Golang搭建web服务内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/phpper/p/10408206.html

延伸 · 阅读

精彩推荐
  • GolangGo语言应该什么情况使用指针

    Go语言应该什么情况使用指针

    go语言的指针类型和C/C++的指针类型用法是一样的,那么Go语言应该什么情况使用指针,本文就详细的介绍一下,感兴趣的可以了解一下...

    微客鸟窝11432021-08-17
  • Golanggolang中context的作用详解

    golang中context的作用详解

    这篇文章主要介绍了golang中context的作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    梦回故里4522021-03-26
  • Golanggolang实现一个简单的websocket聊天室功能

    golang实现一个简单的websocket聊天室功能

    这篇文章主要介绍了golang实现一个简单的websocket聊天室功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要...

    CNBLOG9112021-11-18
  • GolangGo 每日一库之termtables的使用

    Go 每日一库之termtables的使用

    本文主要介绍了Go 每日一库之termtables的使用,termtables处理表格形式数据的输出。是一个很小巧的工具库。具有一定的参考价值,感兴趣的小伙伴们可以参...

    darjun9662021-08-13
  • Golang关于golang利用channel和goroutine完成统计素数的思路

    关于golang利用channel和goroutine完成统计素数的思路

    这篇文章主要介绍了golang利用channel和goroutine完成统计素数的思路详解,通过思路图分析及实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下...

    墨儿舞步7852021-09-16
  • Golanggolang生成指定位数的随机数的方法

    golang生成指定位数的随机数的方法

    这篇文章主要介绍了golang生成指定位数的随机数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    TigerwolfC11992020-05-29
  • GolangGolang Printf,Sprintf,Fprintf 格式化详解

    Golang Printf,Sprintf,Fprintf 格式化详解

    这篇文章主要介绍了Golang Printf,Sprintf,Fprintf 格式化详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小豆角8812021-04-19
  • GolangGo语言每天必学之switch语句

    Go语言每天必学之switch语句

    这篇文章主要为大家详细介绍了Go语言每天必学之switch语句的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    脚本之家4852020-05-12