Golang创建HTTP服务器的步骤

发表时间: 2024-04-05 09:56

基于 HTTP 构建的网络应用包括两个端,即客户端 ( Client ) 和服务端 ( Server )。

两个端的交互行为包括从客户端发出 request、服务端接受request 进行处理并返回 response 以及客户端处理 response。所以 http 服务器的工作就在于如何接受来自客户端的 request,并向客户端返回 response,。

HTTP Server简单实现

对于 golang 来说,利用 net/http 包实现一个Http Server非常简单,只需要简简单单几句代码就可以实现,先看看 Golang 的其中一种 http server简单的实现:

例1:

package main

import (

"fmt"

"net/http"

)

func handler(w http.ResponseWriter, r *http.Request) {

fmt.Fprintf(w, "hello World!")

}

func main() {

//注册路由

http.HandleFunc("/", handler)

//创建服务且监听

http.ListenAndServe(":8080", nil)

再来看看另外一种http server实现,代码如下:

例2:

package main

import (

"fmt"

"net/http"

)

type routeIndex struct {

content string

}

func (route *routeIndex) ServeHTTP(w http.ResponseWriter, r *http.Request) {

fmt.Fprintf(w, route.content)

}

func main() {

//注册路由

http.Handle("/", &routeIndex{content: "Hello, World"})

//创建服务且监听

http.ListenAndServe(":8080", nil)

上述两种方法都实现了简单的 http server实现,写法虽然不同,但底层用到的原理其实都是一样的,我们通过源码进行解析。

在上述两种实现种,分别调用了 http.Handle 和 http.HandleFunc 来实现路由的处理,展开源码看看:

func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {

DefaultServeMux.HandleFunc(pattern, handler)

}

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {

if handler == nil {

panic("http: nil handler")

}

mux.Handle(pattern, HandlerFunc(handler))

}

func (mux *ServeMux) Handle(pattern string, handler Handler) {

....

总结 http.Handle 和 http.HandleFunc 函数代码,可以得出以下几个重点内容: DefaultServeMux ,ServeMux, Handler 以及 ServeMux.Handle函数。