add: 模仿gin框架
This commit is contained in:
		
							parent
							
								
									500c147acb
								
							
						
					
					
						commit
						6633420cf6
					
				
							
								
								
									
										67
									
								
								web/framework/framework-context/gee/context.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								web/framework/framework-context/gee/context.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,67 @@
 | 
			
		||||
package gee
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type H map[string]interface{}
 | 
			
		||||
 | 
			
		||||
type Context struct {
 | 
			
		||||
	Writer     http.ResponseWriter
 | 
			
		||||
	Req        *http.Request
 | 
			
		||||
	Path       string
 | 
			
		||||
	Method     string
 | 
			
		||||
	StatusCode int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newContext(w http.ResponseWriter, r *http.Request) *Context {
 | 
			
		||||
	return &Context{
 | 
			
		||||
		Writer: w,
 | 
			
		||||
		Req:    r,
 | 
			
		||||
		Path:   r.URL.Path,
 | 
			
		||||
		Method: r.Method,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Context) PostForm(key string) string {
 | 
			
		||||
	return c.Req.FormValue(key)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Context) Query(key string) string {
 | 
			
		||||
	return c.Req.URL.Query().Get(key)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Context) Status(code int) {
 | 
			
		||||
	c.StatusCode = code
 | 
			
		||||
	c.Writer.WriteHeader(code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Context) SetHeader(key string, value string) {
 | 
			
		||||
	c.Writer.Header().Set(key, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Context) String(code int, format string, values ...interface{}) {
 | 
			
		||||
	c.SetHeader("Content-Type", "text/plain")
 | 
			
		||||
	c.Status(code)
 | 
			
		||||
	_, _ = c.Writer.Write([]byte(fmt.Sprintf(format, values...)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Context) JSON(code int, obj interface{}) {
 | 
			
		||||
	c.SetHeader("Content-Type", "application/json")
 | 
			
		||||
	c.Status(code)
 | 
			
		||||
	encoder := json.NewEncoder(c.Writer)
 | 
			
		||||
	if err := encoder.Encode(obj); err != nil {
 | 
			
		||||
		http.Error(c.Writer, err.Error(), 500)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (c *Context) Data(code int, data []byte) {
 | 
			
		||||
	c.Status(code)
 | 
			
		||||
	_, _ = c.Writer.Write(data)
 | 
			
		||||
}
 | 
			
		||||
func (c *Context) HTML(code int, html string) {
 | 
			
		||||
	c.SetHeader("Content-Type", "text/html")
 | 
			
		||||
	c.Status(code)
 | 
			
		||||
	_, _ = c.Writer.Write([]byte(html))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								web/framework/framework-context/gee/gee.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								web/framework/framework-context/gee/gee.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
			
		||||
package gee
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type HandlerFunc func(*Context)
 | 
			
		||||
 | 
			
		||||
type Engine struct {
 | 
			
		||||
	router *router
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func New() *Engine {
 | 
			
		||||
	return &Engine{
 | 
			
		||||
		router: newRouter(),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *Engine) addRoute(method string, pattern string, handler HandlerFunc) {
 | 
			
		||||
	e.router.addRoute(method, pattern, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *Engine) GET(pattern string, handler HandlerFunc) {
 | 
			
		||||
	e.addRoute("GET", pattern, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *Engine) POST(pattern string, handler HandlerFunc) {
 | 
			
		||||
	e.addRoute("POST", pattern, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *Engine) Run(addr string) error {
 | 
			
		||||
	return http.ListenAndServe(addr, e)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *Engine) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
 | 
			
		||||
	context := newContext(writer, request)
 | 
			
		||||
	e.router.handle(context)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								web/framework/framework-context/gee/router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								web/framework/framework-context/gee/router.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
package gee
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type router struct {
 | 
			
		||||
	handlers map[string]HandlerFunc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newRouter() *router {
 | 
			
		||||
	return &router{handlers: make(map[string]HandlerFunc)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *router) addRoute(method string, pattern string, handler HandlerFunc) {
 | 
			
		||||
	log.Printf("[Route ] %4s - %s", method, pattern)
 | 
			
		||||
	key := method + "-" + pattern
 | 
			
		||||
	r.handlers[key] = handler
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *router) handle(c *Context) {
 | 
			
		||||
	key := c.Method + "-" + c.Path
 | 
			
		||||
	if handler, ok := r.handlers[key]; ok {
 | 
			
		||||
		handler(c)
 | 
			
		||||
	} else {
 | 
			
		||||
		c.String(http.StatusNotFound, "404 not found:%s\n", c.Path)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								web/framework/framework-context/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								web/framework/framework-context/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golanglearn/web/framework/framework-context/gee"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	engine := gee.New()
 | 
			
		||||
	engine.GET("/", func(c *gee.Context) {
 | 
			
		||||
		c.HTML(200, "<h1>hello</h1>")
 | 
			
		||||
	})
 | 
			
		||||
	engine.GET("/hello", func(c *gee.Context) {
 | 
			
		||||
		c.String(200, "hello,%v", c.Query("name"))
 | 
			
		||||
	})
 | 
			
		||||
	engine.POST("/login", func(c *gee.Context) {
 | 
			
		||||
		c.JSON(200, gee.H{
 | 
			
		||||
			"username": "xxxx",
 | 
			
		||||
			"password": "1234",
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
	_ = engine.Run(":9000")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								web/framework/framework/gee/gee.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								web/framework/framework/gee/gee.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
package gee
 | 
			
		||||
							
								
								
									
										1
									
								
								web/framework/framework/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								web/framework/framework/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
package framework
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user