< 返回技术文档列表

golang中如何使用 net/http 库

发布时间:2021-09-01 01:11:06⊙投诉举报

这篇文章给大家介绍golang中如何使用 net/http 库 ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1、net/http库分为客户端和服务器两部分,库中的结构和函数有些只支持客户端和服务器这两者之一,有的同时支持这两种。

    1)Client、Response、header、Request 和 Cookie 对客户端进行支持
    2)Server、ServerMux、Handler/HandleFunc、ResponseWriter、Header、Request和Cookie则对服务器进行支持

golang中如何使用 net/http 库

golang中如何使用 net/http 库

2、go 创建服务器

    1) func ListenAndServe(addr string, handler Handler) error
         使用指定的监听地址处理器启动一个HTTP服务端。 ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。 eg
 

package main
import (
	"io"
	"net/http"
	"log"
)
// hello world, the web server
func HelloServer(w http.ResponseWriter, req *http.Request) {
	io.WriteString(w, "hello, world!\n")
}
func main() {
	http.HandleFunc("/hello", HelloServer)
	err := http.ListenAndServe(":12345", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

2)type Server

要管理服务端的行为,可以创建一个自定义的Server。Server 结构可以对服务器进行更详细的配置,eg

type Server struct {
    Addr           string        // 监听的TCP地址,如果为空字符串会使用":http"
    Handler        Handler       // 调用的处理器,如为nil会调用http.DefaultServeMux
    ReadTimeout    time.Duration // 请求的读取操作在超时前的最大持续时间
    WriteTimeout   time.Duration // 回复的写入操作在超时前的最大持续时间
    MaxHeaderBytes int           // 请求的头域最大长度,如为0则用DefaultMaxHeaderBytes
    TLSConfig      *tls.Config   // 可选的TLS配置,用于ListenAndServeTLS方法
    // TLSNextProto(可选地)指定一个函数来在一个NPN型协议升级出现时接管TLS连接的所有权。
    // 映射的键为商谈的协议名;映射的值为函数,该函数的Handler参数应处理HTTP请求,
    // 并且初始化Handler.ServeHTTP的*Request参数的TLS和RemoteAddr字段(如果未设置)。
    // 连接在函数返回时会自动关闭。
    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
    // ConnState字段指定一个可选的回调函数,该函数会在一个与客户端的连接改变状态时被调用。
    // 参见ConnState类型和相关常数获取细节。
    ConnState func(net.Conn, ConnState)
    // ErrorLog指定一个可选的日志记录器,用于记录接收连接时的错误和处理器不正常的行为。
    // 如果本字段为nil,日志会通过log包的标准日志记录器写入os.Stderr。
    ErrorLog *log.Logger
    // 内含隐藏或非导出字段
}
s := &http.Server{
	Addr:           ":8080",
	Handler:        myHandler,
	ReadTimeout:    10 * time.Second,
	WriteTimeout:   10 * time.Second,
	MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())

3、HTTPS 

1)func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error
ListenAndServeTLS函数和ListenAndServe函数的行为基本一致,除了它期望HTTPS连接之外。此外,必须提供证书文件和对应的私钥文件。如果证书是由权威机构签发的,certFile参数必须是顺序串联的服务端证书和CA证书。如果srv.Addr为空字符串,会使用":https"。 eg

import (
	"log"
	"net/http"
)
func handler(w http.ResponseWriter, req *http.Request) {
	w.Header().Set("Content-Type", "text/plain")
	w.Write([]byte("This is an example server.\n"))
}
func main() {
	http.HandleFunc("/", handler)
	log.Printf("About to listen on 10443. Go to https://127.0.0.1:10443/")
	err := http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil)
	if err != nil {
		log.Fatal(err)
	}
}

程序员可以使用crypto/tls包的generate_cert.go文件来生成cert.pem和key.pem两个文件。

4、处理器和处理函数

1)处理器就是一个拥有  ServeHTTP 方法的接口。
    1、func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)  ServeHTTP将请求派遣到与请求的URL最匹配的模式对应的处理器。

    2、处理器绑定 http.Handle,http.Handle函数将处理器绑定至 DefaultServeMux。
        func (mux *ServeMux) Handle(pattern string, handler Handler)  Handle注册HTTP处理器handler和对应的模式pattern。如果该模式已经注册有一个处理器,Handle会panic。

2)处理器函数

    处理器函数实际上就是与处理器拥有相同行为的函数,即与ServeHTTP 方法拥有相同参数。HandlerFunc func(ResponseWriter, *Request) 通过类型转换让我们可以将普通的函数作为HTTP处理器使用。如果f是一个具有适当签名的函数,HandlerFunc(f)通过调用f实现了Handler接口。

关于golang中如何使用 net/http 库 就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


/template/Home/Zkeys/PC/Static