ThinkGo
ThinkGo — это легковесный MVC-фреймворк, написанный на Go (Golang).
Установка
Единственное требование — наличие языка программирования Go.
go get -u github.com/forgoer/thinkgo
Быстрый старт
package main
import (
"fmt"
"github.com/forgoer/thinkgo"
"github.com/forgoer/thinkgo/think"
)
func main() {
th := thinkgo.New()
th.RegisterRoute(func(route *think.Route) {
route.Get("/", func(req *think.Req) *think.Res {
return think.Text("Hello ThinkGo !")
})
route.Get("/ping", func(req *think.Req) *think.Res {
return think.Json(map[string]string{
"message": "pong",
})
})
// Dependency injection
route.Get("/user/{name}", func(req *think.Req, name string) *think.Res {
return think.Text(fmt.Sprintf("Hello %s !", name))
})
})
// listen and serve on 0.0.0.0:9011
th.Run()
}
Особенности
Маршрутизация
Самые простые маршруты принимают URI и замыкание, предоставляя очень простой и выразительный способ определения маршрутов:
think.RegisterRoute(func(route *router.Route) {
route.Get("/foo", func(req *context.Request) *context.Response {
return thinkgo.Text("Hello ThinkGo !")
})
})
Маршрутизатор позволяет регистрировать маршруты, которые отвечают на любой HTTP-метод:
route.Get("/someGet", getting)
route.Post("/somePost", posting)
route.Put("/somePut", putting)
route.Delete("/someDelete", deleting)
route.Patch("/somePatch", patching)
route.Options("/someOptions", options)
Иногда вам может потребоваться зарегистрировать маршрут, который отвечает на несколько HTTP-методов. Вы даже можете зарегистрировать маршрут, который отвечает на все HTTP-методы, используя метод Any
:
route.Any("/someAny", any)
Конечно, иногда вам нужно будет захватить сегменты URI в вашем маршруте. Например, вам может понадобиться захватить идентификатор пользователя из URL. Вы можете сделать это, определив параметры маршрута:
route.Get("/user/{id}", func(req *context.Request, id string) *context.Response {
return
``` **Тинк гоу. Текст (фнт. Спринтф («Пользователь %s», ид))**
Вы можете определить столько параметров маршрута, сколько требуется для вашего маршрута:
**Тинк гоу. Текст («Возможно определение такого количества параметров маршрута, которое требуется вашему маршруту»)**
```go
route.Get("/posts/{post}/comments/{comment}", func(req *context.Request, postId, commentId string) *context.Response {
//
})
Метод префикса может использоваться для добавления префикса к каждому маршруту в группе с заданным URI. Например, вы можете захотеть добавить префикс «admin» ко всем URI маршрутов в группе:
Префиксы маршрутов могут быть использованы для добавления префиксов к маршрутам группы. В качестве примера можно привести добавление префикса «admin» к URI всех маршрутов группы.
route.Prefix("/admin").Group(func(group *router.Route) {
group.Prefix("user").Group(func(group *router.Route) {
// ...
})
group.Prefix("posts").Group(func(group *router.Route) {
// ...
})
})
Группы маршрутов позволяют совместно использовать атрибуты маршрутов, такие как промежуточное ПО или префикс, для большого количества маршрутов без необходимости определять эти атрибуты для каждого отдельного маршрута.
Группы маршрутов предоставляют возможность совместного использования атрибутов маршрутов, таких как промежуточное программное обеспечение и префиксы, для множества маршрутов. При этом нет необходимости определять атрибуты для каждого маршрута отдельно.
route.Prefix("/admin").Group(func(group *router.Route) {
group.Prefix("user").Group(func(group *router.Route) {
group.Get("", func(request *context.Request) *context.Response {
return thinkgo.Text("admin user !")
}).Middleware(func(request *context.Request, next router.Closure) interface{} {
if _, err := request.Input("id"); err != nil {
return thinkgo.Text("Invalid parameters")
}
return next(request)
})
group.Get("edit", func(request *context.Request) *context.Response {
return thinkgo.Text("admin user edit !")
})
}).Middleware(func(request *context.Request, next router.Closure) interface{} {
if _, err := request.Input("user"); err != nil {
return thinkgo.Text("Invalid parameters")
}
return next(request)
})
}).Middleware(func(request *context.Request, next router.Closure) interface{} {
if _, err := request.Input("token"); err != nil {
return thinkgo.Text("Invalid parameters")
}
return next(request)
})
Промежуточное ПО предоставляет удобный механизм фильтрации HTTP-запросов, поступающих в приложение. Вам нужно только реализовать интерфейс Middleware
.
Промежуточное программное обеспечение обеспечивает удобный способ фильтрации входящих HTTP-запросов. Для этого необходимо реализовать интерфейс Middleware.
route.Get("/foo", func(request *context.Request) *context.Response {
return thinkgo.Text("Hello ThinkGo !")
}).Middleware(func(request *context.Request, next router.Closure) interface{} {
if _, err := request.Input("name"); err != nil {
return thinkgo.Text("Invalid parameters")
}
return next(request)
})
Будет ли промежуточное ПО выполняться до или после обработки запроса, зависит от самого промежуточного ПО. Например, следующее промежуточное ПО будет выполнять некоторую задачу до того, как запрос будет обработан приложением:
Выполнение промежуточного программного обеспечения до или после обработки запроса зависит от него самого. Так, например, следующее промежуточное программное обеспечение выполняет определённую задачу перед обработкой запроса приложением.
func(request *context.Request, next router.Closure) interface{} {
// Perform action
// ...
return next(request)
}
Однако это промежуточное ПО выполнит свою задачу после того, как запрос будет обработан приложением:
В то же время это промежуточное программное обеспечение выполнит свою задачу уже после обработки запроса приложением:
func(request *context.Request, next router.Closure) interface{} {
response := next(request)
// Perform action
// ...
return response
}
Ниже приведён пример базового класса контроллера.
Пример базового класса контроллера представлен ниже.
package controller
import (
"github.com/forgoer/thinkgo"
"github.com/forgoer/thinkgo/context"
)
func Index(req *context.Request) *context.Response {
return thinkgo.Text("Hello ThinkGo !")
}
Вы можете определить маршрут для этого контроллера следующим образом:
Для этого контроллера можно определить маршрут следующим образом.
route.Get("/", controller.Index)
Эта функция будет поддерживаться в будущем выпуске.
Чтобы получить экземпляр текущего HTTP-запроса через внедрение зависимостей
Чтобы получить текущий HTTP-запрос через внедрение зависимости
func Handler(req *context.Request) *context.Response {
name := req.Input("name")
}
Если метод контроллера также ожидает ввода данных от параметра маршрута, вам следует перечислить параметры вашего маршрута после зависимостей запроса. Например, вы можете получить доступ к... Ваш запрос:
your route parameter name
like so:
route.Put("/user/{name}", func(req *context.Request, name string) *context.Response {
//
})
Ваш параметр маршрута name
:
route.Put("/user/{name}", функция(req *context.Запрос, имя строка) *context.Ответ {
//
})
Далее идёт текст без запроса перевода.
Пожалуйста, сообщите, если у вас остались вопросы. Извлечение и сохранение
Иногда требуется извлечь элемент из кэша, а также сохранить значение по умолчанию, если запрошенный элемент не существует. Например, можно извлечь всех пользователей из кэша или, если их там нет, получить их с помощью обратного вызова и добавить в кэш. Это можно сделать с помощью метода Remember:
var foo int
cache.Remember("foo", &a, 1*time.Minute, func() interface{} {
return "thinkgo"
})
См. ThinkGo Cache (https://github.com/forgoer/thinkgo/tree/master/cache).
См. ThinkORM (https://github.com/forgoer/thinkorm).
Этот проект лицензирован под лицензией Apache 2.0 (LICENSE).
Если у вас есть какие-либо проблемы или пожелания, пожалуйста, свяжитесь с нами. Мы приветствуем PR.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )