首页 > 其他分享 >Go 语言中 net/http 标准库的初步使用

Go 语言中 net/http 标准库的初步使用

时间:2023-08-02 21:25:06浏览次数:53  
标签:http 多路复用 Server ListenAndServe Go 服务器 net 路由

1. 概述

Go 中的 net/http 库提供了 HTTP 客户端和服务端的实现。也就是说 net/http 可以分为客户端服务器端两部分,库中的结构和函数有些只支持客户端和服务器这两者中的一个,而有些则同时支持客户端和服务器,如下图所示:

image

2. 对 web 服务器的理解的示意图

image

2.1. http 服务器(只讨论http,不讨论https的情况)

在 Go 语言的 net/http 库中,创建一个 HTTP 服务器的方式:

方式一:

http.ListenAndServe("", nil)

# 说明:
#     http.ListenAndServe 函数用于创建一个普通的 HTTP 服务器,它需要传入监听的地址和处理请求的多路复用器。
#     网络地址参数为空字符串,则服务器默认使用 80 端口进行网络连接
#     如果处理器参数为 nil,那么服务器将使用默认的多路复用器 DefaultServeMux

方式二:

s := &http.Server{
    Addr:           ":8080",
    Handler:        nil,
}
s.ListenAndServe()

# 说明:
#    创建一个自定义的 Server,管理服务端的行为

2.2. 多路复用器

根据上面的图片所示,我们定义的处理函数,要将其注册到 多路复用器 里面,而 多路复用器 是 HTTP服务器 中的一个模块,多路复用器的创建方式:

方式一:默认的多路复用器 DefaultServeMux

# 创建方式:
#    根据上面创建 http 服务器的两种方式,传入的处理器参数为 nil,则服务器将使用默认的多路复用器 DefaultServeMux

# 1. 传入的处理器为 nil
http.ListenAndServe("", nil)

# 2. 传入的处理器为 nil
s := &http.Server{
    Addr:           ":8080",
    Handler:        nil,
}
s.ListenAndServe()

=====================================

# 往这个默认的多路复用器中注册处理函数
#     使用 HandleFunc 函数可以向 DefaultServeMux 添加处理器。

http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World")
})

方式二:新的多路复用器

# 创建方式:
#     使用 http.NewServeMux() 创建一个新的多路复用器

mux := http.NewServeMux()

server := http.Server{
    Addr:    ":8080",
    Handler: mux,
}

err := server.ListenAndServe()
if err != nil {
    fmt.Println("Server start failed:", err)
}

=====================================

# 往这个多路复用器中注册处理函数:

mux.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World")
})

3. 简单示例

3.1. 使用默认的多路复用器的服务器示例代码

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // 注册路由,将处理函数注册到默认的多路复用器 DefaultServeMux 上
    http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    })

    // 启动服务器
    http.ListenAndServe(":8080", nil)
}

运行以上代码,将在本地启动一个监听 8080 端口的服务器。当访问 http://localhost:8080 时,服务器将返回 "Hello World"

3.2. 使用新的多路复用器的服务器示例代码

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // 创建一个新的 ServeMux
    mux := http.NewServeMux()

    // 定义路由处理函数
    helloHandler := func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    }

    // 注册路由,往这个新的 ServeMux 中添加一个路由处理函数
    mux.HandleFunc("/", helloHandler)

    // 启动服务器
    http.ListenAndServe(":8080", mux)
}

3.3. 使用 http.Server 结构体创建服务器的示例代码

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // 创建一个新的 ServeMux
    mux := http.NewServeMux()

    // 定义路由处理函数
    helloHandler := func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    }

    // 注册路由,往这个新的 ServeMux 中添加一个路由处理函数
    mux.HandleFunc("/", helloHandler)

    // 创建一个新的 Server 结构体
    server := &http.Server{
        Addr:    ":8080",
        Handler: mux,
    }

    // 启动服务器
    server.ListenAndServe()
}

在这个示例中,我们首先创建了一个新的 http.ServeMux,用于注册和管理路由。然后,我们使用 http.Server 结构体指定服务器的配置,包括监听地址和处理程序。最后,我们使用 ListenAndServe 方法启动服务器。

无论是使用 http.ListenAndServe 还是使用 http.Server,都可以实现一个简单的服务器。但是,使用 http.Server 结构体可以更好地控制服务器的行为,并提供更多的配置选项。

3.4. 使用 http.Server 结构体并使用默认的多路复用器的示例代码

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // 定义路由处理函数
    helloHandler := func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    }

    // 注册路由到默认的多路复用器上
    http.HandleFunc("/", helloHandler)

    // 创建一个新的 Server 结构体
    server := &http.Server{
        Addr: ":8080",
    }

    // 启动服务器
    server.ListenAndServe()
}

在这个示例中,我们省略了显式创建 ServeMux 的步骤,而是直接使用 http.HandleFunc 将路由注册到默认的多路复用器上。然后,我们创建了一个新的 http.Server 结构体,并将其配置为监听地址为 :8080。最后,我们使用 ListenAndServe 方法启动服务器。

在这种情况下,服务器将使用默认的多路复用器来处理路由。这是因为 http.HandleFunc 实际上是将路由注册到默认的多路复用器 http.DefaultServeMux 上。所以,如果你想使用默认的多路复用器,你可以简单地使用 http.HandleFunc 注册路由,而不需要显式创建一个新的 ServeMux

4. 标准库文档

Go语言标准库文档中文版

标签:http,多路复用,Server,ListenAndServe,Go,服务器,net,路由
From: https://www.cnblogs.com/wanghuizhao/p/17601758.html

相关文章

  • Python基础day57 Django模板继承和模型层
    模板之标签就是在模板里面使用流程控制:if、else、elseif、for标签看起来是这样的:{%tag%}for标签{%forpersoninperson_list%}{{forloop}}<p>{{person.name}}</p>{%endfor%}{%forpersoninperson_list%}{#判断list是否有值,没有就走empty#}......
  • Kubernetes主流网络插件介绍
    一、Flannel1.1简介Flannel由CoreOS研发,使用”虚拟网桥和veth设备”的方式为Pod创建虚拟网络接口,通过可配置的后端(backend)定义Pod间的通信网络。它支持基于VXLAN和UDP的Overlay网络,以及基于三层路由的Underlay网络。    对于每一个容器而言,在加入网络时,在每个节点创建一......
  • 仅三天,我用 GPT-4 生成了性能全网第一的 Golang Worker Pool,轻松打败 GitHub 万星项目
    目录1.我写了一个超牛的开源项目1.1你看看这性能1.2你看看这功能1.3你猜我这一百天都经历了啥2.你有多久没写并发程序了?3.问:一个WorkerPool程序需要包含哪些功能?4.让GPT-4写第一行代码!4.1我对GPT-4说4.2GPT-4回答4.3我又对GPT-4说4.4GPT-4给出了新的回答4.5......
  • Django之models模型层、测试环境的搭建
    一、models层中常见的几种查询方法1、2、  二、测试环境的搭建1、app应用中默认有一个tests.py的测试文件,拷贝manage.py的内容如下到tests.py中此时这个测试文件就能使用django环境了importosimportsysif__name__=='__main__':os.environ.setdefault('DJA......
  • RS232转Profinet网关rs232串门转网门接法
    大家好,今天我要给大家带来一个很有意思的案例分享。你们猜猜,这回我们要用捷米的一款神奇的网关JM-RS485/232-PN做什么呢?没错,我们要把一台扫码枪设备通过这个RS232转PROFINET网关,接入到一台西门子S7-1200PLC的Profinet网络中。想象一下,一个看似普通的扫码枪,通过这个神奇的网关,就能......
  • RS232自由转Profinet网关rs232串门转网门接法
    你是否曾经遇到过这样的问题:如何在不编写复杂代码的情况下,将条形码数据上传到PLC?今天,我们将为你揭示一个简单的解决方案!让我们来看看这个神奇的组合:捷米的JM-RS485/232-PN(rs232转Profient网关)和锐码的TC8850型号多功能无线扫码枪。通过将它们连接起来,我们可以轻松地将现场条形......
  • golang json字符串转结构体
    1、不知道结构体类型的情况下funcJsonStringToMap(jsonStrstring)(map[string]interface{},error){//未知值类型m:=make(map[string]interface{})err:=json.Unmarshal([]byte(jsonStr),&m)iferr!=nil{fmt.Printf("Unmarshalwither......
  • asp.net core docker 部署
    1.添加Dockfile文件#Seehttps://aka.ms/containerfastmodetounderstandhowVisualStudiousesthisDockerfiletobuildyourimagesforfasterdebugging.FROMmcr.microsoft.com/dotnet/aspnet:7.0ASbaseWORKDIR/appEXPOSE80EXPOSE443COPY..ENTRYPOINT["......
  • HTTP代理是什么?比较好的HTTP代理商有哪些?
    什么是HTTP代理?HTTP代理是一种网络代理技术,主要作用是接收用户发送的HTTP请求,并将这些请求转发到目标服务器,在用户和目标服务器之间充当中介。HTTP代理在各个领域都有广泛的应用。数据抓取:HTTP代理可用于大规模的数据采集任务,实现高并发请求,帮助用户高效获取不同区域、大量的数......
  • RunnerGo五种压测模式你会配置吗
    我们在做性能测试时需要根据性能需求配置不同的压测模式如:阶梯模式。使用jmeter时我们需要安装插件来配置测试模式,为了方便用户使用,RunnerGo内嵌了压测模式这一选项,今天给大家介绍一下RunnerGo的几种压测模式和怎么根据性能需求选择合适的压测模式。RunnerGo提供了以下五种压测模......