本篇是完全参考gin的功能,自己手动实现一个类似的功能,帮助自己理解和学习gin框架
目的
- 简单介绍net/http库以及http.Handler接口
- 实现简单的功能
标准库启动Web服务
import "net/http"
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
}
func main() {
http.HandleFunc("/hello", helloHandler)
http.ListenAndServe(":8088", nil)
}
设置了一个 /hello 路由,请求返回 hello world。
~ curl 127.0.0.1:8088/hello
hello world
http.ListenAndServe源码查看
// ListenAndServe监听TCP网络地址addr,然后调用
//使用处理程序处理传入连接的请求。
//被接受的连接被配置为使能TCP keepalive。
//
//处理程序通常为nil,在这种情况下使用DefaultServeMux。
//
// ListenAndServe总是返回一个非nil错误。
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
实现http.Handler接口
- http.HandleFunc的第二个参数是什么意思,点进官方包看是什么
package http
type Handler interface {
ServeHTTP(w ResponseWriter, r *Request)
}
第二个参数是要实现 Handler 接口的方法,根据路由匹配交给实现对应的方法处理。
基于此对方法改造封装mygin.go
package mygin
import (
"net/http"
)
type Engine struct {
}
func (e *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/":
w.Write([]byte("success \n"))
case "/hello":
w.Write([]byte("hello world! \n"))
default:
w.Write([]byte("404 NOT FOUND" + r.URL.Path + " \n"))
}
}
func Default() *Engine {
return &Engine{}
}
func (e *Engine) Run(addr string) {
err := http.ListenAndServe(addr, e)
if err != nil {
return
}
}
调用main.go
package main
import "gophp/mygin"
func main() {
engine := mygin.Default()
engine.Run(":8088")
}
curl请求
~ curl 127.0.0.1:8088/hello
hello world!
~ curl 127.0.0.1:8088
success
标签:Http,world,Mygin,ListenAndServe,func,简单,Handler,http,hello
From: https://www.cnblogs.com/pengb/p/17967495