Documentation ¶
Overview ¶
Package web provides quick start framework for web application.
Main features of Hiboot web application ¶
Web MVC (Model-View-Controller).
Auto Configuration, pre-created instance with properties configs for dependency injection.
Dependency injection with the struct tag `inject:""` or the constructor.
Dependency injection in Go ¶
Dependency injection is a concept valid for any programming language. The general concept behind dependency injection is called Inversion of Control. According to this concept a struct should not configure its dependencies statically but should be configured from the outside.
Dependency Injection design pattern allows us to remove the hard-coded dependencies and make our application loosely coupled, extendable and maintainable.
A Go struct has a dependency on another struct, if it uses an instance of this struct. We call this a struct dependency. For example, a struct which accesses a user controller has a dependency on user service struct.
Ideally Go struct should be as independent as possible from other Go struct. This increases the possibility of reusing these struct and to be able to test them independently from other struct.
The following example shows a struct which has no hard dependencies.
Example ¶
This example shows that jwtToken is injected through method Init, once you imported "hidevops.io/hiboot/pkg/starter/jwt", jwtToken jwt.Token will be injectable.
package main import ( "hidevops.io/hiboot/pkg/app" "hidevops.io/hiboot/pkg/app/web" "hidevops.io/hiboot/pkg/model" "hidevops.io/hiboot/pkg/starter/jwt" "time" ) // This example shows that jwtToken is injected through method Init, // once you imported "hidevops.io/hiboot/pkg/starter/jwt", // jwtToken jwt.Token will be injectable. func main() { // the web application entry web.NewApplication().Run() } // PATH: /login type loginController struct { web.Controller token jwt.Token } type userRequest struct { // embedded field model.RequestBody mark that userRequest is request body model.RequestBody Username string `json:"username" validate:"required"` Password string `json:"password" validate:"required"` } func init() { // Register Rest Controller through constructor newLoginController app.Register(newLoginController) } // newLoginController inject jwtToken through the argument jwtToken jwt.Token on constructor // the dependency jwtToken is auto configured in jwt starter, see https://hidevops.io/hiboot/tree/master/pkg/starter/jwt func newLoginController(token jwt.Token) *loginController { return &loginController{ token: token, } } // Post / // The first word of method is the http method POST, the rest is the context mapping func (c *loginController) Post(request *userRequest) (response model.Response, err error) { jwtToken, _ := c.token.Generate(jwt.Map{ "username": request.Username, "password": request.Password, }, 30, time.Minute) response = new(model.BaseResponse) response.SetData(jwtToken) return }
Output:
Index ¶
- Constants
- Variables
- func NewApplication(controllers ...interface{}) app.Application
- type Context
- func (ctx *Context) Do(handlers context.Handlers)
- func (ctx *Context) HTML(htmlContents string) (int, error)
- func (ctx *Context) Next()
- func (ctx *Context) RequestBody(data interface{}) error
- func (ctx *Context) RequestForm(data interface{}) error
- func (ctx *Context) RequestParams(data interface{}) error
- func (ctx *Context) ResponseBody(message string, data interface{})
- func (ctx *Context) ResponseError(message string, code int)
- func (ctx *Context) ResponseString(data string)
- func (ctx *Context) Translate(format string, args ...interface{}) string
- type Controller
- type Dispatcher
- type ExtendedContext
- type TestApplication
Examples ¶
Constants ¶
const ( // ViewEnabled is the property for enabling web view ViewEnabled = "web.view.enabled" // ContextPath is the property for setting web view context path ContextPath = "web.view.contextPath" // DefaultPage is the property for setting default page DefaultPage = "web.view.defaultPage" // ResourcePath is the property for setting resource path ResourcePath = "web.view.resourcePath" // Extension is the property for setting extension Extension = "web.view.extension" )
const Any = "ANY"
const Profile = "web"
Variables ¶
var ( // ErrControllersNotFound controller not found ErrControllersNotFound = errors.New("[app] controllers not found") // ErrInvalidController invalid controller ErrInvalidController = errors.New("[app] invalid controller") )
var NewTestApplication = RunTestApplication
NewTestApplication is the alias of RunTestApplication Deprecated, you should use RunTestApplication instead
var RestController = app.Register
RestController register rest controller to controllers container Deprecated: please use app.Register() instead
Functions ¶
func NewApplication ¶
func NewApplication(controllers ...interface{}) app.Application
NewApplication create new web application instance and init it
Types ¶
type Context ¶
type Context struct { // Optional Part 1: embed (optional but required if you don't want to override all context's methods) // it's the context/context.go#context struct but you don't need to know it. context.Context ExtendedContext }
Context Create your own custom Context, put any fields you wanna need.
func (*Context) Do ¶
Do The only one important if you will override the Context with an embedded context.Context inside it. Required in order to run the handlers via this "*Context".
func (*Context) Next ¶
func (ctx *Context) Next()
Next The second one important if you will override the Context with an embedded context.Context inside it. Required in order to run the chain of handlers via this "*Context".
func (*Context) RequestBody ¶
RequestBody get RequestBody
func (*Context) RequestForm ¶
RequestForm get RequestFrom
func (*Context) RequestParams ¶
RequestParams get RequestParams
func (*Context) ResponseBody ¶
ResponseBody set response
func (*Context) ResponseError ¶
ResponseError response with error
func (*Context) ResponseString ¶
ResponseString set response
type Controller ¶
type Controller struct { at.RestController ContextMapping string Ctx *Context }
Controller is the web base controller
type Dispatcher ¶ added in v0.9.9
type Dispatcher struct {
// contains filtered or unexported fields
}
type ExtendedContext ¶
type ExtendedContext interface { RequestEx(data interface{}, cb func() error) error RequestBody(data interface{}) error RequestForm(data interface{}) error ResponseBody(message string, data interface{}) ResponseError(message string, code int) }
ExtendedContext extended context
type TestApplication ¶
type TestApplication interface { Initialize() error SetProperty(name string, value ...interface{}) TestApplication Run(t *testing.T) TestApplication Request(method, path string, pathargs ...interface{}) *httpexpect.Request Post(path string, pathargs ...interface{}) *httpexpect.Request Get(path string, pathargs ...interface{}) *httpexpect.Request Put(path string, pathargs ...interface{}) *httpexpect.Request Delete(path string, pathargs ...interface{}) *httpexpect.Request Patch(path string, pathargs ...interface{}) *httpexpect.Request Options(path string, pathargs ...interface{}) *httpexpect.Request }
TestApplication the test web application interface for unit test only
func NewTestApp ¶ added in v0.9.9
func NewTestApp(controllers ...interface{}) TestApplication
NewTestApp returns the new test application
func RunTestApplication ¶ added in v0.9.9
func RunTestApplication(t *testing.T, controllers ...interface{}) TestApplication
RunTestApplication returns the new test application