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
- func NewContext(app ctx.Application) context.Context
- func RequestBody(c context.Context, data interface{}) error
- func RequestForm(c context.Context, data interface{}) error
- func RequestParams(c context.Context, data interface{}) error
- type Context
- func (c *Context) Do(handlers ctx.Handlers)
- func (c *Context) HTML(htmlContents string) (int, error)
- func (c *Context) Next()
- func (c *Context) ResponseBody(message string, data interface{})
- func (c *Context) ResponseError(message string, code int)
- func (c *Context) ResponseString(data string)
- func (c *Context) Translate(format string, args ...interface{}) string
- type Controller
- type Dispatcher
- 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 (
ErrCanNotInterface = errors.New("response can not interface")
)
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
func NewContext ¶ added in v0.11.0
func NewContext(app ctx.Application) context.Context
NewContext constructor of context.Context
func RequestBody ¶ added in v0.11.0
RequestBody get RequestBody
func RequestForm ¶ added in v0.11.0
RequestForm get RequestFrom
func RequestParams ¶ added in v0.11.0
RequestParams get RequestParams
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. ctx.Context }
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 (c *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) ResponseBody ¶
ResponseBody set response
func (*Context) ResponseError ¶
ResponseError response with error
func (*Context) ResponseString ¶
ResponseString set response
type Controller ¶
type Controller struct {
at.RestController
}
Controller is the web base controller please use at.RestController instead
type Dispatcher ¶ added in v0.9.9
type Dispatcher struct {
// contains filtered or unexported fields
}
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