1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yoyofx-yoyogo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_En.md 7.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 00:22 fab1704

YoyoGo — простой, лёгкий и быстрый веб-фреймворк на Go

YoyoGo — это простой, лёгкий и быстрый Web framework, написанный на языке Go.

Особенности:

  • Красивый и быстрый роутер.
  • Поддержка middleware.
  • Дружелюбен к REST API.
  • Нет regexp или reflect.
  • Вдохновлён многими отличными фреймворками Go Web.

Установка: go get github.com/yoyofx/yoyogo

Простой пример:

package main
import ...

func main() {
    WebApplication.CreateDefaultBuilder(func(rb router.IRouterBuilder) {
        rb.GET("/info",func (ctx *context.HttpContext) {    // 支持Group方式
            ctx.JSON(200, context.H{"info": "ok"})
        })
    }).Build().Run()       //默认端口号 :8080
}

Задачи:

  1. Стандарт:
  • Печать логотипа (YoyoGo).
  • Унифицированный вход в программу (YoyoGo).
  • Простой маршрутизатор с привязанной функцией обработки.
  • HttpContext (запрос, ответ).
  • Статический файловый сервер (Static File Server).
  • Сериализация JSON структуры (Context.M).
  • Получить файл запроса и сохранить.
  • Объединение данных GET POST (form-data, x-www-form-urlencoded).
  • Привязка модели для HTTP-запроса (From, JSON).
  1. Ответ рендеринг:
  • Интерфейс рендеринга.
  • Рендеринг JSON.
  • JSONP рендеринг.
  • Отформатированный JSON рендеринг.
  • Безопасный JSON рендеринг.
  • ASCII JSON рендеринг.
  • Чистый JSON рендеринг.
  • Двоичные данные рендеринга.
  • Текст.
  • Protobuf.
  • MessagePack.
  • XML.
  • YAML.
  • Файл.
  • Изображение.
  • Шаблон.
  • Автоматическое форматирование рендеринга.
  1. Middleware:
  • Logger.
  • StaticFile.
  • Router.
  • Маршрутизатор middleware.
  • CORS.
  • JWT.
  • Binding.
  1. Router:
  • Поддержка методов GET, POST, HEAD, PUT, DELETE.
  • Дерево маршрутизаторов.
  • Выражение маршрутизатора.
  • RouteData (var).
  • Поддержка маршрутизатора Struct Refect Func Binded.
  • Префикс и группа маршрутизаторов, такие как "/api/v1/endpoint".
  • Контроллер маршрутизатора и шаблон маршрутизатора (по умолчанию).
  • Фильтр маршрутизатора.
  1. Dependency injection:
  • Фреймворк dependency injection.
  • Интеграция dependency injection.
  • Заводская и типовая интеграция dependency injection в фреймворк.
  1. Особенности:
  • Конфигурация.
  • WebSocket.
  • JWT.
  • Swagger.
  • GRpc.
  • Prometheus.

Расширенный пример:

package main
import ...

func main() {
    webHost := CreateCustomWebHostBuilder().Build()
    webHost.Run()
}

func CreateCustomBuilder() *abstractions.HostBuilder {

    configuration := abstractions.NewConfigurationBuilder().
        AddEnvironment().
        AddYamlFile("config").Build()

    return WebApplication.NewWebHostBuilder().
        UseConfiguration(configuration).
        Configure(func(app *WebApplication.WebApplicationBuilder) {
            app.UseMiddleware(middlewares.NewCORS())
            //WebApplication.UseMiddleware(middlewares.NewRequestTracker())
            app.UseStaticAssets()
            app.UseEndpoints(registerEndpointRouterConfig)
            app.UseMvc(func(builder *mvc.ControllerBuilder) {
                //builder.AddViews(&view.Option{Path: "./static/templates"})
                builder.AddViewsByConfig()
                builder.AddController(contollers.NewUserController)
                builder.AddFilter("/v1/user/info", &contollers.TestActionFilter{})
            })
        }).
        ConfigureServices(func(serviceCollection *dependencyinjection.ServiceCollection) {
``` Данный текст написан на языке Go.

serviceCollection.AddTransientByImplements(models.NewUserAction, new(models.IUserAction))  
//eureka.UseServiceDiscovery(serviceCollection)  
//consul.UseServiceDiscovery(serviceCollection)  
nacos.UseServiceDiscovery(serviceCollection)).  
OnApplicationLifeEvent(getApplicationLifeEvent)  
}  

//region endpoint router config function  
func registerEndpoints(rb router.IRouterBuilder) {  
    Endpoints.UseHealth(rb)  
    Endpoints.UseViz(rb)  
    Endpoints.UsePrometheus(rb)  
    Endpoints.UsePprof(rb)  
    Endpoints.UseJwt(rb)

    rb.GET("/error", func(ctx *context.HttpContext) {  
        panic("http get error")  
    })  

    rb.POST("/info/:id", PostInfo)  

    rb.Group("/v1/api", func(rg *router.RouterGroup) {  
        rg.GET("/info", GetInfo)  
    })

    rb.GET("/info", GetInfo)  
    rb.GET("/ioc", GetInfoByIOC)  
}

//endregion  

//region Http Request Methods  
type UserInfo struct {  
    UserName string `param:"username"`  
    Number string `param:"q1"`  
    Id string `param:"id"`  
}

//HttpGet request: /info or /v1/api/info  
//bind UserInfo for id,q1,username  
func GetInfo(ctx *context.HttpContext) {  
    ctx.JSON(200, context.H{"info": "ok"})  
}

func GetInfoByIOC(ctx *context.HttpContext) {  
    var userAction models.IUserAction  
    _ = ctx.RequiredServices.GetService(&userAction)  
    ctx.JSON(200, context.H{"info": "ok " + userAction.Login("zhang")})  
}

//HttpPost request: /info/:id?q1=abc&username=123  
func PostInfo(ctx *context.HttpContext) {  
    qs_q1 := ctx.Query("q1")  
    pd_name := ctx.Param("username")

    userInfo := &UserInfo{}  
    _ = ctx.Bind(userInfo)

    strResult := fmt.Sprintf("Name:%s , Q1:%s , bind: %s", pd_name, qs_q1, userInfo)

    ctx.JSON(200, context.H{"info": "hello world", "result": strResult})  
}

func fireApplicationLifeEvent(life *abstractions.ApplicationLife) {  
    printDataEvent := func(event abstractions.ApplicationEvent) {  
        fmt.Printf("[yoyogo] Topic: %s; Event: %v\n", event.Topic, event.Data)  
    }
    for {  
        select {  
            case ev := <-life.ApplicationStarted:  
                go printDataEvent(ev)  
            case ev := <-life.ApplicationStopped:  
                go printDataEvent(ev)  
                break  
        }  
    }  
}

// mvc  
type UserController struct {  
    *mvc.ApiController  
    userAction models.IUserAction // IOC  
}

// ctor for ioc  
func NewUserController(userAction models.IUserAction) *UserController {  
    return &UserController{userAction: userAction}  
}

// reuqest param binder  
type RegiserRequest struct {  
    mvc.RequestBody  
    UserName string `param:"username"`  
    Password string `param:"password"`  
}

// auto bind action param by ioc  
func (this *UserController) Register(ctx *context.HttpContext, request *RegiserRequest) actionresult.IActionResult {  
    result := Mvc.ApiResult{Success: true, Message: "ok", Data: request}  
    return actionresult.Json{Data: result}  
}

// use userAction interface by ioc  
func (this *UserController) GetInfo() controller.ApiResult {  
    return this.OK(this.userAction.Login("zhang"))  
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yoyofx-yoyogo.git
git@api.gitlife.ru:oschina-mirror/yoyofx-yoyogo.git
oschina-mirror
yoyofx-yoyogo
yoyofx-yoyogo
master