rui

package module
v1.0.1 Latest Latest
Warning

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

Go to latest
Published: Sep 10, 2021 License: MIT Imports: 13 Imported by: 0

README

rui

介绍

很轻量级 web api 开发库,全部调用的官方 http 库。 支持 GET,POST,PUT,DELETE,OPTIONS,HEAD,PATCH 请求分发。 路由使用的 map 的方式,所以是不支持路径作为参数/user/*/info的方式的。

安装教程

go mod 的,可以忽略下面这个。

go get gitee.com/ruige_fun/rui
go get gitee.com/ruige_fun/rlog

gitee.com/ruige_fun/rlog 是日志打印相关的,这个你也可以使用自己定义的。

基本使用
package main

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

func main(){
	app := rui.New(rlog.Info, rlog.Warn, rlog.Error)
	app.Get("/ping", func(ctx rui.Context) {
		ctx.RespJson(
			map[string]interface{}{
				"ip":ctx.GetIPv4(),
			})
	})
	_ = app.Run("", 80)
}

浏览器打开:http://127.0.0.1:80/ping

即可看到以下结果:

{"ip":"127.0.0.1"}
自定义日志
package main

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

func main(){
	app := rui.New(Info, Warn, Error)
	app.Get("/ping", func(ctx rui.Context) {
		ctx.RespJson(
			map[string]interface{}{
				"ip":ctx.GetIPv4(),
			})
	})
	_ = app.Run("", 80)
}

func Info(v ...interface{}){
	log.Println("基本信息:",f,v)
}

func Warn(v ...interface{}){
	log.Println("警告信息:",f,v)
}

func Error(v ...interface{}){
	log.Println("错误信息:",f,v)
}
支持跨域
package main

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

func main(){
	app := rui.New(rlog.Info, rlog.Warn, rlog.Error)
	app.Use(rui.UseCORS) //支持跨域
	app.Get("/ping", func(ctx rui.Context) {
		ctx.RespJson(
			map[string]interface{}{
				"ip":ctx.GetIPv4(),
			})
	})
	_ = app.Run("", 80)
}
路由注册

目前支持:GETPOSTPUTDELETEOPTIONSHEADPATCH 请求的注册。

package main

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

func main(){
	app := rui.New(rlog.Info, rlog.Warn, rlog.Error)
	app.Use(rui.UseCORS) //支持跨域
	app.Get("/get", ping) //注册GET请求
	app.Post("/post", ping) //注册POST请求
	app.Delete("/delete", ping) //注册DELETE请求
	_ = app.Run("", 80)
}

func ping(ctx rui.Context) {
	ctx.RespJson(
		map[string]interface{}{
			"ip":ctx.GetIPv4(),
			"path":ctx.Request().URL.Path,
			"method":ctx.Request().Method,
		})
}
使用原生http的参数
package main

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

func main(){
	app := rui.New(rlog.Info, rlog.Warn, rlog.Error)
	app.Get("/ping", ping) //注册GET请求
	_ = app.Run("", 80)
}

func ping(ctx rui.Context) {
	writer := ctx.ResponseWriter() //原生ResponseWriter
	request := ctx.Request() //原生Request
	_, _ = writer.Write([]byte(fmt.Sprint(request.URL)))
}
静态文件服务
package main

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

func main(){
	app := rui.New(rlog.Info, rlog.Warn, rlog.Error)
	app.Get("/ping", ping) //注册GET请求
	app.Static("/static/", "./public") //注册静态文件服务,将所有 /static/ 开头的请求,使用静态文件服务。映射 ./public 文件夹
	_ = app.Run("", 80)
}

func ping(ctx rui.Context) {
	writer := ctx.ResponseWriter() //原生ResponseWriter
	request := ctx.Request() //原生Request
	_, _ = writer.Write([]byte(fmt.Sprint(request.URL)))
}
body请求体json绑定

读取请求的body,并且json解析到结构体。

请求
curl -X POST -i 'http://127.0.0.1:80/ping' --data '{"code":0,"msg":"消息","data":"数据"}'
代码
package main

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

func main(){
	app := rui.New(rlog.Info, rlog.Warn, rlog.Error)
	app.Any("/ping", ping) //注册 所有 类型的请求。
	_ = app.Run("", 80)
}

type MSG struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

func ping(ctx rui.Context) {
	var msg MSG
	_ = ctx.GetBodyJsonBind(&msg)
	fmt.Println(msg)
	ctx.RespSTD(0, "", ctx.GetIPAndPort())
}
其它方法
Use(fx func(ctx Context) bool)       //添加中间件。中间件函数,返回false则不会继续往后执行。返回true则继续往后执行。声明周期=>/favicon.ico=>static=>use=>func
ResponseWriter() http.ResponseWriter //返回原生 http.ResponseWriter
Request() *http.Request              //返回原生 *http.Request

Static(string, string) //静态服务注册,所有以参数1开头的请求,都转发到静态服务,静态服务,不过中间件。参数1:URL前缀;参数2:映射文件夹。

Get(string, func(Context))     //路由注册。参数1:URL前缀;参数2:处理方法。
Post(string, func(Context))    //路由注册。参数1:URL前缀;参数2:处理方法。
Put(string, func(Context))     //路由注册。参数1:URL前缀;参数2:处理方法。
Delete(string, func(Context))  //路由注册。参数1:URL前缀;参数2:处理方法。
Patch(string, func(Context))   //路由注册。参数1:URL前缀;参数2:处理方法。
Head(string, func(Context))    //路由注册。参数1:URL前缀;参数2:处理方法。
Options(string, func(Context)) //路由注册。参数1:URL前缀;参数2:处理方法。
Any(string, func(Context))     //所有请求类型的路由注册。优先级最高。参数1:URL前缀;参数2:处理方法。
Run(string, uint) error        // Run 启动服务。参数1:绑定的IP地址,如果为空,那就默认本机;参数2:绑定的端口号。 返回值:启动错误信息。

GetIPAndPort() string              //获取IP地址和端口号。比如:127.0.0.1:12345
GetIPv4() string                   //获取IPv4地址。比如:127.0.0.1
GetIPv4XRealIP() string            //获取客户机IPv4地址,这个只有反向代理服务器处理过,才会有值。比如:127.0.0.1
GetIPv4XForwardedFor() string      //获取来源地址,如果只有一个反向代理服务器,那就返回客户机IPv4地址。多个反向代理,那返回的是反向代理服务器的地址。比如:127.0.0.1
GetXForwardedProto() string        //获取转发请求协议。比如:https
GetBody() []byte                   //获取请求主体。
GetBodyJsonBind(interface{}) error //获取请求主体,并且json解码,绑定参数1。注意,参数1必须是结构体的地址。
GetPath() string                   //获取请求path
GetURL() string                    //获取请求URL
GetHeaderRQ() *http.Header         //获取原生的 *http.Request.Header
GetHeaderRW() http.Header          //获取原生的 http.ResponseWriter.Header

HeaderSet(string, string)               //设置响应头
HeaderGet(string) string                //获取响应头
HeaderAdd(string, string)               //添加响应头
HeaderDel(string)                       //删除响应头
Write([]byte)                           //响应body
WriteAndContentType([]byte, string)     //响应body,并且设置content-type
WriteHeaderCode(int)                    //响应状态码
RespStatusCode(int)                     //响应状态码
RespSTD(int, string, interface{})       //响应body,返回标准的json格式。比如:{"code":0,"msg":"OK","data":"123"}
RespString(string)                      //响应body
RespBytes([]byte)                       //响应body
RespBytesAndContentType([]byte, string) //响应body,并且设置content-type
RespJsonBytes([]byte)                   //响应body,会自动往头添加 content-type 。
RespJson(map[string]interface{})        //响应body,会自动往头添加 content-type 。

FormValue(string) string                     //获取URL参数
FormValueString(string, ...string) string    //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
FormValueInt(string, ...int) int             //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
FormValueInt64(string, ...int64) int64       //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
FormValueUint(string, ...uint) uint          //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
FormValueUint64(string, ...uint64) uint64    //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
FormValueFloat64(string, ...float64) float64 //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
FormValueBool(string, ...bool) bool          //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。

PostFormValue(string) string                     //获取POST表单参数
PostFormValueString(string, ...string) string    //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
PostFormValueInt(string, ...int) int             //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
PostFormValueInt64(string, ...int64) int64       //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
PostFormValueUint(string, ...uint) uint          //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
PostFormValueUint64(string, ...uint64) uint64    //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
PostFormValueFloat64(string, ...float64) float64 //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
PostFormValueBool(string, ...bool) bool          //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。

FormFile(string) (multipart.File, *multipart.FileHeader, error) //获取文件表单,适合单文件上传
FormFileSave(string, string) (string, error)                    //获取文件表单,并且保存文件,适合单文件上传
FormFilesSave(string) ([]string, error)                         //获取并保存多个文件,适合多文件上传

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func UseCORS

func UseCORS(ctx Context) bool

Types

type Context

type Context interface {
	Use(fx func(ctx Context) bool)       //添加中间件。中间件函数,返回false则不会继续往后执行。返回true则继续往后执行。声明周期=>/favicon.ico=>static=>use=>func
	ResponseWriter() http.ResponseWriter //返回原生 http.ResponseWriter
	Request() *http.Request              //返回原生 *http.Request

	Static(string, string) //静态服务注册,所有以参数1开头的请求,都转发到静态服务,静态服务,不过中间件。参数1:URL前缀;参数2:映射文件夹。

	Get(string, func(Context))     //路由注册。参数1:URL前缀;参数2:处理方法。
	Post(string, func(Context))    //路由注册。参数1:URL前缀;参数2:处理方法。
	Put(string, func(Context))     //路由注册。参数1:URL前缀;参数2:处理方法。
	Delete(string, func(Context))  //路由注册。参数1:URL前缀;参数2:处理方法。
	Patch(string, func(Context))   //路由注册。参数1:URL前缀;参数2:处理方法。
	Head(string, func(Context))    //路由注册。参数1:URL前缀;参数2:处理方法。
	Options(string, func(Context)) //路由注册。参数1:URL前缀;参数2:处理方法。
	Any(string, func(Context))     //所有请求类型的路由注册。优先级最高。参数1:URL前缀;参数2:处理方法。
	Run(string, uint) error        // Run 启动服务。参数1:绑定的IP地址,如果为空,那就默认本机;参数2:绑定的端口号。 返回值:启动错误信息。

	GetIPAndPort() string              //获取IP地址和端口号。比如:127.0.0.1:12345
	GetIPv4() string                   //获取IPv4地址。比如:127.0.0.1
	GetIPv4XRealIP() string            //获取客户机IPv4地址,这个只有反向代理服务器处理过,才会有值。比如:127.0.0.1
	GetIPv4XForwardedFor() string      //获取来源地址,如果只有一个反向代理服务器,那就返回客户机IPv4地址。多个反向代理,那返回的是反向代理服务器的地址。比如:127.0.0.1
	GetXForwardedProto() string        //获取转发请求协议。比如:https
	GetBody() []byte                   //获取请求主体。
	GetBodyJsonBind(interface{}) error //获取请求主体,并且json解码,绑定参数1。注意,参数1必须是结构体的地址。
	GetPath() string                   //获取请求path
	GetURL() string                    //获取请求URL
	GetHeaderRQ() *http.Header         //获取原生的 *http.Request.Header
	GetHeaderRW() http.Header          //获取原生的 http.ResponseWriter.Header

	HeaderSet(string, string)               //设置响应头
	HeaderGet(string) string                //获取响应头
	HeaderAdd(string, string)               //添加响应头
	HeaderDel(string)                       //删除响应头
	Write([]byte)                           //响应body
	WriteAndContentType([]byte, string)     //响应body,并且设置content-type
	WriteHeaderCode(int)                    //响应状态码
	RespStatusCode(int)                     //响应状态码
	RespSTD(int, string, interface{})       //响应body,返回标准的json格式。比如:{"code":0,"msg":"OK","data":"123"}
	RespString(string)                      //响应body
	RespBytes([]byte)                       //响应body
	RespBytesAndContentType([]byte, string) //响应body,并且设置content-type
	RespJsonBytes([]byte)                   //响应body,会自动往头添加 content-type 。
	RespJson(map[string]interface{})        //响应body,会自动往头添加 content-type 。

	FormValue(string) string                     //获取URL参数
	FormValueString(string, ...string) string    //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	FormValueInt(string, ...int) int             //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	FormValueInt64(string, ...int64) int64       //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	FormValueUint(string, ...uint) uint          //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	FormValueUint64(string, ...uint64) uint64    //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	FormValueFloat64(string, ...float64) float64 //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	FormValueBool(string, ...bool) bool          //获取URL参数,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。

	PostFormValue(string) string                     //获取POST表单参数
	PostFormValueString(string, ...string) string    //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	PostFormValueInt(string, ...int) int             //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	PostFormValueInt64(string, ...int64) int64       //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	PostFormValueUint(string, ...uint) uint          //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	PostFormValueUint64(string, ...uint64) uint64    //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	PostFormValueFloat64(string, ...float64) float64 //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。
	PostFormValueBool(string, ...bool) bool          //获取POST FORM表单,如果该参数不存在或为空,则使用默认值(优先使用指定默认值);参数1:key名称;可选参数2:指定默认值。

	FormFile(string) (multipart.File, *multipart.FileHeader, error) //获取文件表单,适合单文件上传
	FormFileSave(string, string) (string, error)                    //获取文件表单,并且保存文件,适合单文件上传
	FormFilesSave(string) ([]string, error)                         //获取并保存多个文件,适合多文件上传
}

func New

func New(Info, Warn, Error func(v ...interface{})) Context

New 创建一个服务实例,并且设置日志打印函数,如果日志参数为nil,则不打印该等级的日志

func NewDefault

func NewDefault() Context

NewDefault 创建一个服务实例,日志打印默认使用log.Println

func NewNotPrintLog

func NewNotPrintLog() Context

NewNotPrintLog 创建一个服务实例,不打印任何服务日志

Jump to

Keyboard shortcuts

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