Go-Web基础入门教程(含源码)【第一篇】Handler部分

本文是Go-Web基础入门教程的第一篇,详细介绍了如何使用Go的net/http包搭建Web服务,包括Handle请求的注册、内置的Handlers、Request和Response的处理。文章通过实例展示了如何监听和响应HTTP请求,解释了HandleFunc、ServeMux以及不同类型的Handler的使用,并探讨了Request的URL、Header、Body和查询参数。最后,文中还提及了ResponseWriter的使用以及内置的HTTP响应功能。
摘要由CSDN通过智能技术生成

简介

来源于B站视频
课程视频

Go Web

Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务。

01 - 案例

HandleFunc文档简介
能够注册监听的路径pattern并设置访问当前路径触发的回调方法.

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc registers the handler function for the given pattern in the DefaultServeMux. The documentation for ServeMux explains how patterns are matched.

ListenAndServe文档简介
设置监听对应的主机和端口以及对应的处理方法.
第一个参数为网络地址,如果为"",则指的是所有网络接口的80端口.
第二个参数为Handler,如果传入nil,则就是 DefaultServeMux(可以看作是路由器)

func ListenAndServe(addr string, handler Handler) error
ListenAndServe listens on the TCP network address addr and then calls Serve with handler to handle requests on incoming connections. Accepted connections are configured to enable TCP keep-alives.
The handler is typically nil, in which case the DefaultServeMux is used.
ListenAndServe always returns a non-nil error.

案例能够监听localhost:8888并在页面中打印 Hello, World!

	package main
	
	import "net/http"
	
	func main() {
   
		http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
   
			rw.Write([]byte("Hello, World!"))
		})
		http.ListenAndServe("localhost:8888", nil) // DefaultServeMux
	}

02-1 - Handle请求(上)

Go语言如何处理请求

	http.ListenAndServe("localhost:8888", nil)
	// 进入 ListenAndServe 源码部分
	// 其实是创建了一个 server struct
	// Addr表示网络的地址 Handler如果为nil则使用的DSM
	func ListenAndServe(addr string, handler Handler) error {
   
		server := &Server{
   Addr: addr, Handler: handler}
		return server.ListenAndServe()
	}

第二种创建Web Server的方法:
尝试自己使用 server 来执行 ListenAndServe 操作

	func main() {
   
		server := http.Server{
   
			Addr:    "localhost:8888",
			Handler: nil,
		}
		server.ListenAndServe()
	}

Handler本质是一个interface,里面定义了一个方法ServerHTTP()

	type Handler interface {
   
		ServeHTTP(ResponseWriter, *Request)
	}

那么前面提到的DefaultServeMux是什么呢?
DefaultServeMux是一个多路复用器,它也是一个Handler
源码证明

	// DefaultServeMux 是 ServeMux 的指针
	var DefaultServeMux = &defaultServeMux
	var defaultServeMux ServeMux
	// ServeMux 是什么呢? 继续看,发现是一个 struct
	type ServeMux struct{
   ...// 省略}
	// 如何说明一个 ServeMux 是一个 Handler 呢? 只需要实现 ServeHTTP 接口
	func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request){
   ...}

本节案例:
自定义一个handler,然后处理请求

	package main
	
	import "net/http"
	
	type myHandler struct{
   }
	
	func (m *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   
		w.Write([]byte("Hello,IceBear!"))
	}
	
	func main() {
   
		mh := myHandler{
   }
	
		// http.ListenAndServe("localhost:8888", nil)
		server := http.Server{
   
			Addr:    "localhost:8888",
			Handler: &mh,
		}
		server.ListenAndServe()
	}

02-2 - Handle请求(下)

这一节主要讲解两个函数:HandleHandleFunc
如何处理多个handler呢?
首先,不指定 Server struct 里面的 Handler 字段,可以通过http.Handle将某个Handler附加到DefaultServeMux
http.Handle

func Handle(pattern string, handler Handler)
Handle registers the handler for the given pattern in the DefaultServeMux. The documentation for ServeMux explains how patterns are matched.

实际上,ServeMux struct中也有一个 Handle 方法
如果调用 http.Handle ,实际上调用的是DefaultServeMux上的Handle方法.
案例:如何向DefaultServeMux注册Handler

	package main
	
	import "net/http"
	
	type myHandler struct{
   }
	
	func (m *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   
		w.Write([]byte("Hello,IceBear!"))
	}
	
	type aboutHandler struct{
   }
	
	func (m *aboutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   
		w.Write([]byte("Hello,About!"))
	}
	
	func main() {
   
		mh := myHandler{
   }
		ah := aboutHandler{
   }
		// http.ListenAndServe("localhost:8888", nil)
		server := http.Server{
   
			Addr:    "localhost:8888",
			Handler: nil,
		}
		http.Handle("/hello", &mh)
		http.Handle("/about", &ah)
		server.ListenAndServe()
	}

http.HandleFunc原理:
Go定义了一个函数类型HandlerFunc,可以将具有适当函数签名的函数f,适配成一个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))
	}

	// 适配器,可以将具有对应函数类型的函数转换成为一个 Handler
	type HandlerFunc func(ResponseWriter, *Request)
	// ServeHTTP calls f(w, r).
	func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
   
		f(w, r)
}

案例:使用HandleFunc绑定Handler

	package main
	
	import "net/http"
	
	func welcome(w http.ResponseWriter, r *http.Request) {
   
		w.Write([]byte("Welcome!"))
	}
	
	func main() {
   
		mh := myHandler{
   }
		ah := aboutHandler{
   }
		// http.ListenAndServe("localhost:8888", nil)
		server := http
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值