rui

package module
v1.1.1 Latest Latest
Warning

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

Go to latest
Published: Mar 16, 2022 License: MIT Imports: 20 Imported by: 0

README

rui

本文档只适合2.0版本及以后的

更新时间:2022年3月12日14:19:40

介绍

很轻量级 web api 开发库,全部调用的官方 http 库,数据传输主要以json的方式。

支持 GETPOSTPUTDELETEOPTIONSHEADPATCH 请求分发。

路由使用的 map 的方式,所以是不支持路径作为参数/user/*/info的方式的。

type Serve interface {
	Use(fx func(ctx Context), fxs ...func(ctx Context))
	HandleFunc(urlPath string, hf http.HandlerFunc)
	GET(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	POST(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	PUT(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	DELETE(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	PATCH(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	HEAD(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	OPTIONS(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	ANY(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	Run(ip string, port uint) error
	RunTLS(ip string, port uint, certFile string, keyFile string) error

	SetProjectPathLength(length int)
	SetLogLevel(level LogLevel)
	SetLogModel(logModel LogModel)
	GetLogLevel() LogLevel
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Panic(v ...interface{})
}

使用

import "gitee.com/ruige_fun/rui"

案例

基础案例
package main

import (
	"gitee.com/ruige_fun/rui"
	"fmt"
	"log"
	"os"
)

func main() {
	getwd, _ := os.Getwd()
	app := rui.NewDefault()
	app.SetProjectPathLength(len(getwd)) //生产环境,这里要填写常量值,开发环境可以使用os.Getwd的结果
	app.SetLogLevel(rui.LevelInfo)       //设置日志打印等级Debug,Info,Warn,Error,Panic
	app.SetLogModel(rui.ModelEnd)        //设置日志打印模式,请求时打印,还是响应后打印

	//全局中间件
	app.Use(func(c rui.Context) {
		log.Println("中间件1", c.GetFirstIPv4())
		c.Next()
	})

	app.GET("/",
		//局部中间件
		func(c rui.Context) {
			log.Println("中间件2")
			c.Next()
		},
		//响应处理
		func(c rui.Context) {
			c.RespRecordStart()             //开始记录响应结果
			pv4 := c.GetFirstIPv4()         //获取相对真实IP地址
			c.Info(pv4)                     //打印日志
			c.WriteStd(0, "成功", 1024, 8888) //标准json输出格式返回给前端
			all := c.RespRecordReadAll()    //读取记录的响应结果,也就是返回给前端的内容
			fmt.Println(string(all))
		})
	app.Run("", 80) //运行服务
}

image-20220312140128603

简单案例
package main

import (
	"gitee.com/ruige_fun/rui"
)

func main() {
	app := rui.NewDefault()
	app.GET("/", func(c rui.Context) {
		c.WriteStd(0, "成功", []string{"数据1", "数据2"}, nil)
	})
	app.Run("", 80) //运行服务
}

image-20220312140520396

query参数绑定到结构体

注意,表单字段名称,使用的结构体字段标签json

package main

import (
	"gitee.com/ruige_fun/rui"
)

type Params struct {
	ID    uint    `json:"id"`
	Name  string  `json:"name"`
	Score float64 `json:"score"`
}

func main() {
	app := rui.NewDefault()
	app.GET("/ping", func(c rui.Context) {
		var p Params
		c.FormValueBind(&p)
		c.Info(p)
		c.WriteStd(0, "成功", p, nil)
	})
	app.Run("", 80) //运行服务
}

image-20220312140910134

post参数绑定到结构体

注意,表单字段名称,使用的结构体字段标签json

package main

import (
	"gitee.com/ruige_fun/rui"
)

type Params struct {
	ID    uint    `json:"id"`
	Name  string  `json:"name"`
	Score float64 `json:"score"`
}

func main() {
	app := rui.NewDefault()
	app.POST("/ping", func(c rui.Context) {
		var p Params
		c.PostFormValueBind(&p)
		c.Info(p)
		c.WriteStd(0, "成功", p, nil)
	})
	app.Run("", 80) //运行服务
}

image-20220312141352744

image-20220312141402917

body请求体绑定到结构体
package main

import (
	"gitee.com/ruige_fun/rui"
)

type Params struct {
	ID    uint    `json:"id"`
	Name  string  `json:"name"`
	Score float64 `json:"score"`
}

func main() {
	app := rui.NewDefault()
	app.POST("/ping", func(c rui.Context) {
		var p Params
		_ = c.ReadBodyJsonBind(&p)
		c.Info(p)
		c.WriteStd(0, "成功", p, nil)
	})
	app.Run("", 80) //运行服务
}

image-20220312141549166

image-20220312141602213

更多案例,请参考上下文方法

type Context interface {
	context.Context
	// Next 一般用于中间件,表示允许继续执行后续的处理函数
	Next()
	//RespRecordStart 开始记录响应内容,只会记录Write开头的写入
	RespRecordStart()
	//RespRecordReader 读取响应内容
	RespRecordReader() io.Reader
	// RespRecordReadAll 读取全部响应内容,会清空已写入的记录
	RespRecordReadAll() []byte
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Panic(v ...interface{})

	// ResponseWriter 原生响应处理
	ResponseWriter() http.ResponseWriter
	// Request 原生请求
	Request() *http.Request
	// GetHeaderReq 获取请求头
	GetHeaderReq() *http.Header
	// SetHeaderResp 设置响应头
	SetHeaderResp() http.Header

	// SetStatusCode 设置响应码
	SetStatusCode(code uint)
	// SetContentType 设置响应头content-type
	SetContentType(contentType string)
	// SetContentTypeToJson 设置响应头content-type为json类型
	SetContentTypeToJson()

	// GetRemoteAddr 获取IP地址和端口号,获取真实IP地址,请使用GetFirstIP
	GetRemoteAddr() string
	// GetIP 获取IP地址,假如是反向代理过来的,请使用GetFirstIP获取IP地址
	GetIP() string
	//GetXRealIP 获取请求头X-Real-IP
	GetXRealIP() string
	// GetIPXRealIP 获取相对真实的IP地址,这个是读取的请求头X-Real-IP
	GetIPXRealIP() string
	//GetXForwardedFor 获取请求头X-Forwarded-For
	GetXForwardedFor() string
	// GetIPXForwardedFor 获取反向代理服务器的IP地址,这个是读取的请求头X-Forwarded-For
	GetIPXForwardedFor() string
	// GetFirstIP 获取相对真实的IP地址,获取优先级
	GetFirstIP() string
	// GetPath 获取请求路径
	GetPath() string
	// GetURL 获取请求URL
	GetURL() string

	// ReadBody 读取请求体
	ReadBody() []byte
	// ReadCopyBody 复制一份请求体出来
	ReadCopyBody() []byte
	// ReadBodyJsonBind 读取请求体,json解码到结构体,参数必须是地址类型
	ReadBodyJsonBind(v interface{}) error

	// WriteStd 往响应体里写入数据,按照默认的结构(json编码后)返回
	WriteStd(code int, msg string, data interface{}, other interface{})
	// Write 往响应体里写入数据
	Write(body []byte)
	// WriteString 往响应体里写入数据
	WriteString(s string)
	// WriteJsonMap 往响应体里写入数据,将参数编码为json后再写,自动添加content-type
	WriteJsonMap(mp map[string]interface{})
	// WriteJson 往响应体里写入数据,将参数(必须是地址类型)编码为json后再写,自动添加content-type
	WriteJson(v interface{})

	// FormValue 获取普通表单字段
	FormValue(key string) string
	// FormValueString 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueString(key string, def ...string) string
	// FormValueInt 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueInt(key string, def ...int) int
	// FormValueInt64 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueInt64(key string, def ...int64) int64
	// FormValueFloat64 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueFloat64(key string, def ...float64) float64
	// FormValueBool 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueBool(key string, def ...bool) bool
	// FormFile 获取表单上传的文件
	FormFile(key string) (multipart.File, *multipart.FileHeader, error)
	// FormValueBind 将普通表单字段,绑定到结构体,参数为结构体地址类型,结构体成员必须是key-value。
	//如果字段为空或错误,则不对结构体成员赋值,保持原有的默认值。
	//字段名称为结构体成员的tag = json,只支持基本的bool,int全家,uint全家,float全家,string类型。
	FormValueBind(v interface{})

	// FormFileSave 获取表单上传的文件并保存,返回文件名sha256值+扩展名
	FormFileSave(key string, savePath string) (string, error)
	// FormFilesSave 接收多文件并且存储,返回文件名切片,文件名sha256值+扩展名
	FormFilesSave(savePath string) ([]string, error)

	// PostFormValue 获取POST表单字段
	PostFormValue(key string) string
	// PostFormValueString 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueString(key string, def ...string) string
	// PostFormValueInt 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueInt(key string, def ...int) int
	// PostFormValueInt64 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueInt64(key string, def ...int64) int64
	// PostFormValueFloat64 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueFloat64(key string, def ...float64) float64
	// PostFormValueBool 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueBool(key string, def ...bool) bool
	// PostFormValueBind 将POST表单字段,绑定到结构体,参数为结构体地址类型,结构体成员必须是key-value。
	//如果字段为空或错误,则不对结构体成员赋值,保持原有的默认值。
	//字段名称为结构体成员的tag = json,只支持基本的bool,int全家,uint全家,float全家,string类型。
	PostFormValueBind(v interface{})
}

Documentation

Index

Constants

View Source
const (
	ContentTypeJson = `application/json; charset=UTF-8`
)

Variables

This section is empty.

Functions

func NewCORS added in v1.1.1

func NewCORS(headers []string) func(ctx Context)

NewCORS 创建个支持跨域的中间件 参数为允许的额外请求头列表

func UseCORS

func UseCORS(ctx Context)

UseCORS 默认的允许跨域中间件,允许的额外请求头:Content-Type,Authorization。 允许更多额外的请求头,请使用NewCORS

Types

type Context

type Context interface {
	context.Context
	// Next 一般用于中间件,表示允许继续执行后续的处理函数
	Next()
	//RespRecordStart 开始记录响应内容,只会记录Write开头的写入
	RespRecordStart()
	//RespRecordReader 读取响应内容
	RespRecordReader() io.Reader
	// RespRecordReadAll 读取全部响应内容,会清空已写入的记录
	RespRecordReadAll() []byte
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Panic(v ...interface{})

	// ResponseWriter 原生响应处理
	ResponseWriter() http.ResponseWriter
	// Request 原生请求
	Request() *http.Request
	// GetHeaderReq 获取请求头
	GetHeaderReq() *http.Header
	// SetHeaderResp 设置响应头
	SetHeaderResp() http.Header

	// SetStatusCode 设置响应码
	SetStatusCode(code uint)
	// SetContentType 设置响应头content-type
	SetContentType(contentType string)
	// SetContentTypeToJson 设置响应头content-type为json类型
	SetContentTypeToJson()

	// GetRemoteAddr 获取IP地址和端口号,获取真实IP地址,请使用GetFirstIP
	GetRemoteAddr() string
	// GetIP 获取IP地址,假如是反向代理过来的,请使用GetFirstIP获取IP地址
	GetIP() string
	//GetXRealIP 获取请求头X-Real-IP
	GetXRealIP() string
	// GetIPXRealIP 获取相对真实的IP地址,这个是读取的请求头X-Real-IP
	GetIPXRealIP() string
	//GetXForwardedFor 获取请求头X-Forwarded-For
	GetXForwardedFor() string
	// GetIPXForwardedFor 获取反向代理服务器的IP地址,这个是读取的请求头X-Forwarded-For
	GetIPXForwardedFor() string
	// GetFirstIP 获取相对真实的IP地址,获取优先级
	GetFirstIP() string
	// GetPath 获取请求路径
	GetPath() string
	// GetURL 获取请求URL
	GetURL() string

	// ReadBody 读取请求体
	ReadBody() []byte
	// ReadCopyBody 复制一份请求体出来
	ReadCopyBody() []byte
	// ReadBodyJsonBind 读取请求体,json解码到结构体,参数必须是地址类型
	ReadBodyJsonBind(v interface{}) error

	// WriteStd 往响应体里写入数据,按照默认的结构(json编码后)返回
	WriteStd(code int, msg string, data interface{}, other interface{})
	// Write 往响应体里写入数据
	Write(body []byte)
	// WriteString 往响应体里写入数据
	WriteString(s string)
	// WriteJsonMap 往响应体里写入数据,将参数编码为json后再写,自动添加content-type
	WriteJsonMap(mp map[string]interface{})
	// WriteJson 往响应体里写入数据,将参数(必须是地址类型)编码为json后再写,自动添加content-type
	WriteJson(v interface{})

	// FormValue 获取普通表单字段
	FormValue(key string) string
	// FormValueString 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueString(key string, def ...string) string
	// FormValueInt 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueInt(key string, def ...int) int
	// FormValueInt64 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueInt64(key string, def ...int64) int64
	// FormValueFloat64 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueFloat64(key string, def ...float64) float64
	// FormValueBool 获取普通表单字段,如果为空或有错,则赋值参数2
	FormValueBool(key string, def ...bool) bool
	// FormFile 获取表单上传的文件
	FormFile(key string) (multipart.File, *multipart.FileHeader, error)
	// FormValueBind 将普通表单字段,绑定到结构体,参数为结构体地址类型,结构体成员必须是key-value。
	//如果字段为空或错误,则不对结构体成员赋值,保持原有的默认值。
	//字段名称为结构体成员的tag = json,只支持基本的bool,int全家,uint全家,float全家,string类型。
	FormValueBind(v interface{})

	// FormFileSave 获取表单上传的文件并保存,返回文件名sha256值+扩展名
	FormFileSave(key string, savePath string) (string, error)
	// FormFilesSave 接收多文件并且存储,返回文件名切片,文件名sha256值+扩展名
	FormFilesSave(savePath string) ([]string, error)

	// PostFormValue 获取POST表单字段
	PostFormValue(key string) string
	// PostFormValueString 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueString(key string, def ...string) string
	// PostFormValueInt 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueInt(key string, def ...int) int
	// PostFormValueInt64 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueInt64(key string, def ...int64) int64
	// PostFormValueFloat64 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueFloat64(key string, def ...float64) float64
	// PostFormValueBool 获取POST表单字段,如果为空或有错,则赋值参数2
	PostFormValueBool(key string, def ...bool) bool
	// PostFormValueBind 将POST表单字段,绑定到结构体,参数为结构体地址类型,结构体成员必须是key-value。
	//如果字段为空或错误,则不对结构体成员赋值,保持原有的默认值。
	//字段名称为结构体成员的tag = json,只支持基本的bool,int全家,uint全家,float全家,string类型。
	PostFormValueBind(v interface{})
}

Context 上下文处理

type Log added in v1.1.1

type Log interface {
	Debug(string)
	Info(string)
	Warn(string)
	Error(string)
	Panic(string)
}

type LogLevel added in v1.1.1

type LogLevel int
const (
	LevelDebug LogLevel = iota
	LevelInfo
	LevelWarn
	LevelError
	LevelPanic
)

type LogModel added in v1.1.1

type LogModel int
const (
	ModelStart LogModel = iota
	ModelEnd
)

type Serve added in v1.0.2

type Serve interface {
	Use(fx func(ctx Context), fxs ...func(ctx Context))
	HandleFunc(urlPath string, hf http.HandlerFunc)
	GET(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	POST(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	PUT(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	DELETE(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	PATCH(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	HEAD(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	OPTIONS(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	ANY(urlPath string, fx func(ctx Context), fxs ...func(ctx Context))
	Run(ip string, port uint) error
	RunTLS(ip string, port uint, certFile string, keyFile string) error

	SetProjectPathLength(length int)
	SetLogLevel(level LogLevel)
	SetLogModel(logModel LogModel)
	GetLogLevel() LogLevel
	Debug(v ...interface{})
	Info(v ...interface{})
	Warn(v ...interface{})
	Error(v ...interface{})
	Panic(v ...interface{})
}

Serve 服务

func New

func New() Serve

New 创建一个服务,不打印请求日志

func NewCustom added in v1.1.1

func NewCustom(myLog Log) Serve

NewCustom 创建一个服务,自定义日志打印

func NewDefault

func NewDefault() Serve

NewDefault 创建一个服务,打印日志

Jump to

Keyboard shortcuts

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