xin

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 12, 2025 License: MIT Imports: 22 Imported by: 1

README

xin

xin 是一个轻量级的 Go Web 框架,专注于简单性和性能。它基于标准库 net/http 构建,提供了更便捷的 API 和常用的中间件。

特性

  • 轻量级,无过多第三方依赖
  • 基于标准库 net/http,性能优异
  • 简单直观的路由系统
  • 丰富的中间件支持
  • 支持静态文件服务

版本要求

  • Go 版本 >= 1.18

安装

go get github.com/fengjx/xin

快速开始

package main

import (
	"log"
	"net/http"

	"github.com/fengjx/xin"
	"github.com/fengjx/xin/middleware"
)

func main() {
	app := xin.New()
	app.Use(middleware.Logger)
	app.GET("/", func(w http.ResponseWriter, r *http.Request) {
		xin.WriteString(w, http.StatusOK, "Hello World!")
	})
	log.Println("Server starting on :8080...")
	app.Run(":8080", true)
}

路由系统

HTTP 方法支持
// GET 请求
app.GET("/users", handleUsers)

// POST 请求
app.POST("/users", createUser)

// PUT 请求
app.PUT("/users/:id", updateUser)

// DELETE 请求
app.DELETE("/users/:id", deleteUser)

// PATCH 请求
app.PATCH("/users/:id", patchUser)

// OPTIONS 请求
app.OPTIONS("/users", optionsUser)

// HEAD 请求
app.HEAD("/users", headUser)

// 绑定任意 method
app.Any("/any", anyHandler)
子路由
app.Sub("/api", func(r *xin.Mux) {
	r.GET("/users", handleUsers)
	r.POST("/users", createUser)
})

g := app.Group("/api/v1")
g.HandleFunc("GET /foo", func(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "foo v1")
})
静态文件服务
// 静态页面,支持 index.html 自动查找
app.Static("/static", "./static")

// 自定义文件系统
app.StaticFS("/assets", myCustomFS)

请求参数处理

参数绑定
// 绑定 URL 参数和表单数据到结构体
type UserForm struct {
    Name  string `json:"name" binding:"required"`
    Email string `json:"email" binding:"required,email"`
}

func handler(w http.ResponseWriter, r *http.Request) {
    var form UserForm
    if err := xin.ShouldBind(r, &form); err != nil {
        // 处理错误
        return
    }
}

// 绑定 JSON 数据到结构体
func jsonHandler(w http.ResponseWriter, r *http.Request) {
    var user UserForm
    if err := xin.ShouldBindJSON(r, &user); err != nil {
        // 处理错误
        return
    }
}
获取请求参数
// 获取查询参数
name := xin.GetQuery(r, "name")                    // 如果不存在返回空字符串
page := xin.GetQueryDefault(r, "page", "1")        // 如果不存在返回默认值

// 获取表单参数
email := xin.GetForm(r, "email")                   // 如果不存在返回空字符串
role := xin.GetFormDefault(r, "role", "user")      // 如果不存在返回默认值

// 获取请求头
token := xin.GetHeader(r, "Authorization")         // 如果不存在返回空字符串
lang := xin.GetHeaderDefault(r, "Accept-Language", "en-US") // 如果不存在返回默认值

// 获取 Cookie
sessionID, err := xin.GetCookie(r, "session_id")   // 如果不存在返回错误
userID := xin.GetCookieDefault(r, "user_id", "")   // 如果不存在返回默认值

中间件

内置中间件
// 日志中间件
app.Use(middleware.Logger)

// CORS 中间件
app.Use(middleware.CORS)

// 压缩中间件
app.Use(middleware.Compress(5))

// 请求超时中间件
app.Use(middleware.Timeout(30 * time.Second))

// 请求 ID 中间件
app.Use(middleware.RequestID)
自定义中间件
func MyMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 前置处理
		next.ServeHTTP(w, r)
		// 后置处理
	})
}

app.Use(MyMiddleware)

错误处理

// 在 context 中设置错误
ctx = xin.WithError(ctx, err)

// 从 context 中获取错误
if err := xin.CtxError(ctx); err != nil {
	// 处理错误
}

// 在请求中设置错误
r = xin.WithErrRequest(r, err)

// 从请求中获取错误
if err := xin.CtxRequestErr(r); err != nil {
	// 处理错误
}

示例

更多示例可以在 examples 目录中找到:

性能

  • 轻量级设计,基于 net/http 标准库
  • 支持中间件链和子路由模式

许可

本项目采用 MIT 许可证,详见 LICENSE 文件。

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Debug = false

Functions

func CtxError

func CtxError(ctx context.Context) error

CtxError 从 context 中获取错误 ctx 是包含错误的 context 返回存储在 context 中的错误,如果没有错误则返回 nil

func CtxRequestErr

func CtxRequestErr(r *http.Request) error

CtxRequestErr 从 http.Request 的 context 中获取错误 r 是包含错误的 http.Request 返回存储在 request context 中的错误,如果没有错误则返回 nil

func Dir

func Dir(root string, listDirectory bool) fs.FS

Dir 返回 http.FileSystem 实现 listDirectory = true,返回 http.Dir() listDirectory = false,返回 onlyFilesFS,不会显示目录

func FileHandler

func FileHandler(prefix string, fs fs.FS) http.Handler

FileHandler 处理静态文件请求 参考 http.StripPrefix

func GetCookie

func GetCookie(r *http.Request, name string) (string, error)

GetCookie 获取Cookie值,如果不存在返回空字符串和错误

func GetCookieDefault

func GetCookieDefault(r *http.Request, name, defaultValue string) string

GetCookieDefault 获取Cookie值,如果不存在返回默认值

func GetForm

func GetForm(r *http.Request, key string) string

GetForm 获取表单参数,如果参数不存在返回空字符串

func GetFormDefault

func GetFormDefault(r *http.Request, key, defaultValue string) string

GetFormDefault 获取表单参数,如果参数不存在返回默认值

func GetHeader

func GetHeader(r *http.Request, key string) string

GetHeader 获取请求头,如果不存在返回空字符串

func GetHeaderDefault

func GetHeaderDefault(r *http.Request, key, defaultValue string) string

GetHeaderDefault 获取请求头,如果不存在返回默认值

func GetQuery

func GetQuery(r *http.Request, key string) string

GetQuery 获取URL查询参数,如果参数不存在返回空字符串

func GetQueryDefault

func GetQueryDefault(r *http.Request, key, defaultValue string) string

GetQueryDefault 获取URL查询参数,如果参数不存在返回默认值

func GetRealIP

func GetRealIP(r *http.Request) string

GetRealIP 从 request 获取真实客户端ip

func HandlerChain

func HandlerChain(h http.Handler, middlewares ...HTTPMiddleware) http.Handler

HandlerChain 使用中间件包装 handler

func LogDebug

func LogDebug(v ...any)

func LogDebugf

func LogDebugf(format string, v ...any)

func LogError

func LogError(v ...any)

func LogErrorf

func LogErrorf(format string, v ...any)

func LogInfo

func LogInfo(v ...any)

func LogInfof

func LogInfof(format string, v ...any)

func OnlyFilesFS

func OnlyFilesFS(fs fs.FS, listDirectory bool, root string) fs.FS

OnlyFilesFS 将 fs.FS 包装为 onlyFilesFS root 可以设置根路径,文件将会从根路径开始查找

func SetDebug

func SetDebug(debug bool)

func SetLogger

func SetLogger(logger Logger)

SetLogger 设置全局默认的日志实例

func ShouldBind

func ShouldBind(r *http.Request, obj any) error

ShouldBind 从参数url参数和form表单解析参数

func ShouldBindJSON

func ShouldBindJSON(r *http.Request, obj any) error

ShouldBindJSON 从body解析json

func WithErrRequest

func WithErrRequest(r *http.Request, err error) *http.Request

WithErrRequest 将错误添加到 http.Request 的 context 中 r 是原始的 http.Request err 是要存储的错误 返回包含错误 context 的新 http.Request

func WithError

func WithError(ctx context.Context, err error) context.Context

WithError 将错误添加到 context 中 ctx 是原始的 context err 是要存储的错误 返回包含错误的新 context

func WrapHandler

func WrapHandler(h http.Handler) http.HandlerFunc

WrapHandler wraps `http.Handler` into `http.HandlerFunc`.

func Write

func Write(w http.ResponseWriter, code int, contentType string, message any) error

Write 写入响应内容

func WriteJSON

func WriteJSON(w http.ResponseWriter, code int, data any) error

WriteJSON 写入JSON响应

func WriteNoContent

func WriteNoContent(w http.ResponseWriter, code int) error

WriteNoContent 只返回响应码,不返回内容

func WriteString

func WriteString(w http.ResponseWriter, code int, message any) error

WriteString 写入响应

Types

type HTTPMiddleware

type HTTPMiddleware func(http.Handler) http.Handler

HTTPMiddleware http.Handler 请求中间件

type Logger

type Logger interface {
	Debug(v ...any)
	Debugf(format string, v ...any)
	Info(v ...any)
	Infof(format string, v ...any)
	Error(v ...any)
	Errorf(format string, v ...any)
}

Logger 定义了日志接口

func GetLogger

func GetLogger() Logger

GetLogger 获取全局默认的日志实例

func NewCustomLogger

func NewCustomLogger(infoOut, debugOut, errorOut io.Writer) Logger

NewCustomLogger 创建一个自定义输出的日志实现

func NewStdLogger

func NewStdLogger() Logger

NewStdLogger 创建一个标准输出的日志实现

type Map

type Map map[string]any

Map is a map of string to any.

type MiddlewareFunc

type MiddlewareFunc func(next http.HandlerFunc) http.HandlerFunc

MiddlewareFunc http.HandlerFunc 请求中间件

func WrapMiddleware

func WrapMiddleware(m HTTPMiddleware) MiddlewareFunc

WrapMiddleware wraps `func(http.Handler) http.Handler` into `xin.MiddlewareFunc`

type Mux

type Mux struct {
	*http.ServeMux
	// contains filtered or unexported fields
}

Mux http 路由

func NewMux

func NewMux() *Mux

NewMux 创建一个新的 HTTP 路由复用器

func (*Mux) Any

func (mux *Mux) Any(pattern string, hf http.HandlerFunc) *Mux

Any alias for HandleFunc

func (*Mux) DELETE

func (mux *Mux) DELETE(relativePath string, hf http.HandlerFunc) *Mux

DELETE 绑定 DELETE 请求

func (*Mux) GET

func (mux *Mux) GET(relativePath string, hf http.HandlerFunc) *Mux

GET 绑定 GET 请求

func (*Mux) Group

func (mux *Mux) Group(prefix string) *Mux

Group 注册路由组

func (*Mux) HEAD

func (mux *Mux) HEAD(relativePath string, hf http.HandlerFunc) *Mux

HEAD is a shortcut for router.Handle("HEAD", path, handlers).

func (*Mux) Handle

func (mux *Mux) Handle(pattern string, handler http.Handler) *Mux

Handle 注册HTTP处理器 参考 http.ServeMux.Handle [METHOD ][HOST]/[PATH]

func (*Mux) HandleFunc

func (mux *Mux) HandleFunc(pattern string, hf http.HandlerFunc) *Mux

HandleFunc 注册HTTP处理函数 参考 http.ServeMux.HandleFunc [METHOD][HOST]/[PATH]

func (*Mux) OPTIONS

func (mux *Mux) OPTIONS(relativePath string, hf http.HandlerFunc) *Mux

OPTIONS 绑定 OPTIONS 请求

func (*Mux) PATCH

func (mux *Mux) PATCH(relativePath string, hf http.HandlerFunc) *Mux

PATCH 绑定 PATCH 请求

func (*Mux) POST

func (mux *Mux) POST(relativePath string, hf http.HandlerFunc) *Mux

POST 绑定 POST 请求

func (*Mux) PUT

func (mux *Mux) PUT(relativePath string, hf http.HandlerFunc) *Mux

PUT 绑定 PUT 请求

func (*Mux) ServeHTTP

func (mux *Mux) ServeHTTP(w http.ResponseWriter, r *http.Request)

func (*Mux) Static

func (mux *Mux) Static(pattern string, root string) *Mux

Static 注册静态文件服务 默认不显示文件目录

func (*Mux) StaticFS

func (mux *Mux) StaticFS(pattern string, fs fs.FS) *Mux

StaticFS 注册静态文件服务,自定义文件系统 fs 可以使用 luchen.Dir() 创建

func (*Mux) Use

func (mux *Mux) Use(middlewares ...HTTPMiddleware) *Mux

Use 注册中间件

type Xin

type Xin struct {
	// contains filtered or unexported fields
}

Xin 是核心Web服务器结构体,用于管理HTTP路由和服务器操作

func New

func New() *Xin

New 创建一个新的Xin实例

func (*Xin) Any

func (x *Xin) Any(pattern string, hf http.HandlerFunc) *Xin

Any alias for HandleFunc

func (*Xin) DELETE

func (x *Xin) DELETE(relativePath string, hf http.HandlerFunc) *Xin

DELETE 绑定 DELETE 请求

func (*Xin) GET

func (x *Xin) GET(relativePath string, hf http.HandlerFunc) *Xin

GET 注册一个处理GET请求的路由 relativePath 为相对路径 hf 为处理HTTP请求的函数

func (*Xin) Group

func (x *Xin) Group(prefix string) *Mux

Group 注册路由组

func (*Xin) HEAD

func (x *Xin) HEAD(relativePath string, hf http.HandlerFunc) *Xin

HEAD is a shortcut for router.Handle("HEAD", path, handlers).

func (*Xin) Handle

func (x *Xin) Handle(pattern string, handler http.Handler) *Xin

Handle 注册一个处理特定模式的HTTP处理器 pattern 格式为 "[METHOD ][HOST]/[PATH]" handler 为实现了http.Handler接口的处理器

func (*Xin) HandleFunc

func (x *Xin) HandleFunc(pattern string, hf http.HandlerFunc) *Xin

HandleFunc 注册一个处理特定模式的处理函数 pattern 格式为 "[METHOD ][HOST]/[PATH]" hf 为处理HTTP请求的函数

func (*Xin) HostPort

func (x *Xin) HostPort() (host string, port int)

HostPort 获取服务器地址和端口

func (*Xin) Mux

func (x *Xin) Mux() *Mux

Mux 获取路由

func (*Xin) OPTIONS

func (x *Xin) OPTIONS(relativePath string, hf http.HandlerFunc) *Xin

OPTIONS 绑定 OPTIONS 请求

func (*Xin) PATCH

func (x *Xin) PATCH(relativePath string, hf http.HandlerFunc) *Xin

PATCH 绑定 PATCH 请求

func (*Xin) POST

func (x *Xin) POST(relativePath string, hf http.HandlerFunc) *Xin

POST 注册一个处理POST请求的路由 relativePath 为相对路径 hf 为处理HTTP请求的函数

func (*Xin) PUT

func (x *Xin) PUT(relativePath string, hf http.HandlerFunc) *Xin

PUT 绑定 PUT 请求

func (*Xin) RecoverHandle

func (x *Xin) RecoverHandle(fn errs.RecoverHandle) *Xin

Recover 设置 panic 处理函数

func (*Xin) Run

func (x *Xin) Run(address string, sync bool) error

Run 启动HTTP服务器 sync 是否同步启动 address 参数格式为 "host:port",例如 ":8080" 或 "192.168.1.100:8080"

func (*Xin) Serve

func (x *Xin) Serve(ln net.Listener, sync bool) error

Serve 启动HTTP服务器 sync 是否同步启动

func (*Xin) Shutdown

func (x *Xin) Shutdown(timeout time.Duration) error

Shutdown 优雅地停止服务器

func (*Xin) Static

func (x *Xin) Static(pattern string, root string) *Xin

Static 注册静态文件服务 pattern 为URL匹配模式 root 为静态文件所在的根目录路径

func (*Xin) StaticFS

func (x *Xin) StaticFS(pattern string, fs fs.FS) *Xin

StaticFS 注册自定义文件系统的静态文件服务 pattern 为URL匹配模式 fs 为实现了fs.FS接口的文件系统

func (*Xin) Use

func (x *Xin) Use(middlewares ...HTTPMiddleware) *Xin

Use 添加全局中间件 middlewares 可以添加多个中间件,它们将按照添加顺序依次执行

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL