there

package module
v1.1.1 Latest Latest
Warning

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

Go to latest
Published: Jul 11, 2021 License: GPL-3.0 Imports: 8 Imported by: 0

README

there

"there" also called "GoThere" aims to be a simple Go Library to reduce redundant code for REST APIs.

Despite the existence of the other libraries, "there"s existence is justified by the minor amount of code you have to write to make API calls go there where you want to.

Example

Basic GET and POST routing without database implementation

package main

import (
	. "github.com/Gebes/there"
)

type User struct {
	Id   int    `json:"id,omitempty" validate:"required"`
	Name string `json:"name,omitempty" validate:"required"`
}

func main() {
	router := Router{
		Port:              8080,
		LogRouteCalls:     true,
		LogResponseBodies: true,
		AlwaysLogErrors:   true,
	}

	router.HandleGet("/user", func(request Request) Response {
		return ResponseData(StatusOK, User{
			1, "John",
		})
	})
	router.HandlePost("/user", func(request Request) Response {

		var user User
		err := request.ReadBody(&user)
		if err != nil {
			return ResponseData(StatusBadRequest, err)
		}

		// code

		return ResponseData(StatusOK, "Saved the user to the database")

	})

	err := router.Listen()
	if err != nil {
		panic(err)
	}
}

Documentation

Index

Constants

View Source
const (
	MethodGet     = "GET"
	MethodHead    = "HEAD"
	MethodPost    = "POST"
	MethodPut     = "PUT"
	MethodPatch   = "PATCH" // RFC 5789
	MethodDelete  = "DELETE"
	MethodConnect = "CONNECT"
	MethodOptions = "OPTIONS"
	MethodTrace   = "TRACE"
)
View Source
const (
	StatusContinue           = 100 // RFC 7231, 6.2.1
	StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
	StatusProcessing         = 102 // RFC 2518, 10.1
	StatusEarlyHints         = 103 // RFC 8297

	StatusOK                   = 200 // RFC 7231, 6.3.1
	StatusCreated              = 201 // RFC 7231, 6.3.2
	StatusAccepted             = 202 // RFC 7231, 6.3.3
	StatusNonAuthoritativeInfo = 203 // RFC 7231, 6.3.4
	StatusNoContent            = 204 // RFC 7231, 6.3.5
	StatusResetContent         = 205 // RFC 7231, 6.3.6
	StatusPartialContent       = 206 // RFC 7233, 4.1
	StatusMultiStatus          = 207 // RFC 4918, 11.1
	StatusAlreadyReported      = 208 // RFC 5842, 7.1
	StatusIMUsed               = 226 // RFC 3229, 10.4.1

	StatusMultipleChoices  = 300 // RFC 7231, 6.4.1
	StatusMovedPermanently = 301 // RFC 7231, 6.4.2
	StatusFound            = 302 // RFC 7231, 6.4.3
	StatusSeeOther         = 303 // RFC 7231, 6.4.4
	StatusNotModified      = 304 // RFC 7232, 4.1
	StatusUseProxy         = 305 // RFC 7231, 6.4.5

	StatusTemporaryRedirect = 307 // RFC 7231, 6.4.7
	StatusPermanentRedirect = 308 // RFC 7538, 3

	StatusBadRequest                   = 400 // RFC 7231, 6.5.1
	StatusUnauthorized                 = 401 // RFC 7235, 3.1
	StatusPaymentRequired              = 402 // RFC 7231, 6.5.2
	StatusForbidden                    = 403 // RFC 7231, 6.5.3
	StatusNotFound                     = 404 // RFC 7231, 6.5.4
	StatusMethodNotAllowed             = 405 // RFC 7231, 6.5.5
	StatusNotAcceptable                = 406 // RFC 7231, 6.5.6
	StatusProxyAuthRequired            = 407 // RFC 7235, 3.2
	StatusRequestTimeout               = 408 // RFC 7231, 6.5.7
	StatusConflict                     = 409 // RFC 7231, 6.5.8
	StatusGone                         = 410 // RFC 7231, 6.5.9
	StatusLengthRequired               = 411 // RFC 7231, 6.5.10
	StatusPreconditionFailed           = 412 // RFC 7232, 4.2
	StatusRequestEntityTooLarge        = 413 // RFC 7231, 6.5.11
	StatusRequestURITooLong            = 414 // RFC 7231, 6.5.12
	StatusUnsupportedMediaType         = 415 // RFC 7231, 6.5.13
	StatusRequestedRangeNotSatisfiable = 416 // RFC 7233, 4.4
	StatusExpectationFailed            = 417 // RFC 7231, 6.5.14
	StatusTeapot                       = 418 // RFC 7168, 2.3.3
	StatusMisdirectedRequest           = 421 // RFC 7540, 9.1.2
	StatusUnprocessableEntity          = 422 // RFC 4918, 11.2
	StatusLocked                       = 423 // RFC 4918, 11.3
	StatusFailedDependency             = 424 // RFC 4918, 11.4
	StatusTooEarly                     = 425 // RFC 8470, 5.2.
	StatusUpgradeRequired              = 426 // RFC 7231, 6.5.15
	StatusPreconditionRequired         = 428 // RFC 6585, 3
	StatusTooManyRequests              = 429 // RFC 6585, 4
	StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

	StatusInternalServerError           = 500 // RFC 7231, 6.6.1
	StatusNotImplemented                = 501 // RFC 7231, 6.6.2
	StatusBadGateway                    = 502 // RFC 7231, 6.6.3
	StatusServiceUnavailable            = 503 // RFC 7231, 6.6.4
	StatusGatewayTimeout                = 504 // RFC 7231, 6.6.5
	StatusHTTPVersionNotSupported       = 505 // RFC 7231, 6.6.6
	StatusVariantAlsoNegotiates         = 506 // RFC 2295, 8.1
	StatusInsufficientStorage           = 507 // RFC 4918, 11.5
	StatusLoopDetected                  = 508 // RFC 5842, 7.2
	StatusNotExtended                   = 510 // RFC 2774, 7
	StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6
)

HTTP status codes as registered with IANA. See: https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

Variables

View Source
var ErrorNotRunning = errors.New("there: Server is not running")

Functions

func CheckArrayContains

func CheckArrayContains(slice []string, toSearch string) bool

CheckArrayContains checks if a string array contains a specific element

func StatusText

func StatusText(code int) string

StatusText returns a text for the HTTP status code. It returns the empty string if the code is unknown.

Types

type Handler

type Handler func(request Request) Response

type HandlerContainer

type HandlerContainer struct {
	// contains filtered or unexported fields
}

HandlerContainer contains the Handler Func and the allowed methods. If the methods slice is empty, then all methods are allowed.

type Request

type Request struct {
	RawRequest *http.Request
	RawWriter  *http.ResponseWriter
}

func (*Request) Method

func (request *Request) Method() string

func (*Request) Path

func (request *Request) Path() string

func (*Request) ReadBody

func (request *Request) ReadBody(body interface{}) error

ReadBody reads the body of an http.Request as a json to the provided interface{}.

func (*Request) ReadParams

func (request *Request) ReadParams(requiredParameters ...string) ([]string, error)

ReadParams generates a slice of parameters in the order you parse them. Returns an error if at least one parameter is missing

type Response

type Response struct {
	Status int         `json:"status,omitempty"`
	Data   interface{} `json:"message,omitempty"`
	// contains filtered or unexported fields
}

func ResponseData

func ResponseData(statusCode int, data interface{}) Response

ResponseData is a response with a status code and data

func ResponseDataP

func ResponseDataP(statusCode int, data interface{}) *Response

ResponseDataP is a response pointer with a status code and data

func ResponseStatus

func ResponseStatus(statusCode int) Response

ResponseStatus creates a simple response only with a status code and the text from the status code

func ResponseStatusP

func ResponseStatusP(statusCode int) *Response

ResponseStatusP creates a simple response pointer only with a status code and the text from the status code

func (*Response) IsError

func (response *Response) IsError() bool

IsError returns true if the Data is an error or pointer to an error

func (*Response) ToJson

func (response *Response) ToJson() []byte

type RouteHandler

type RouteHandler struct {
	// contains filtered or unexported fields
}

func (*RouteHandler) ServeHTTP

func (globalHandler *RouteHandler) ServeHTTP(rawWriter http.ResponseWriter, rawRequest *http.Request)

type Router

type Router struct {

	// Port to listen
	Port int

	// LogRouteCalls defines if all accesses to a route should be logged
	//	2021/06/20 21:07:40 GET /user resulted in 200
	LogRouteCalls bool

	// LogResponseBodies defines if all the different responses from
	// all routes should be logged or not, provided that Router.LogRouteCalls
	// is enabled
	LogResponseBodies bool

	// AlwaysLogErrors defines if errors in a there.Response should be logged
	// or not, independent of the status code. Overrides Router.LogResponseBodies
	// and Router.LogRouteCalls
	AlwaysLogErrors bool

	// SetupResponseHeaders are automatically set, before a request gets forwarded
	// to its handler
	SetupResponseHeaders map[string]string
	// contains filtered or unexported fields
}

func (*Router) EnsureRunning

func (router *Router) EnsureRunning()

EnsureRunning panics if start hasn't been called, because the router cannot work if the http.Server is nil

func (*Router) Handle

func (router *Router) Handle(route string, handler Handler, methods ...string)

Handle registers a HandlerContainer with it's allowed methods. If no http method is provided, then all methods are allowed

func (*Router) HandleConnect

func (router *Router) HandleConnect(route string, handler Handler)

HandleConnect register Connect request

func (*Router) HandleDelete

func (router *Router) HandleDelete(route string, handler Handler)

HandleDelete register v request

func (*Router) HandleGet

func (router *Router) HandleGet(route string, handler Handler)

HandleGet register Get request

func (*Router) HandleHead

func (router *Router) HandleHead(route string, handler Handler)

HandleHead register Head request

func (*Router) HandleOptions

func (router *Router) HandleOptions(route string, handler Handler)

HandleOptions register Options request

func (*Router) HandlePatch

func (router *Router) HandlePatch(route string, handler Handler)

HandlePatch register Patch request

func (*Router) HandlePost

func (router *Router) HandlePost(route string, handler Handler)

HandlePost register Post request

func (*Router) HandlePut

func (router *Router) HandlePut(route string, handler Handler)

HandlePut register Put request

func (*Router) HandleTrace

func (router *Router) HandleTrace(route string, handler Handler)

HandleTrace register Trace request

func (*Router) IsRunning

func (router *Router) IsRunning() bool

IsRunning returns if the server is running, as long as the router.server object is not nil

func (*Router) Listen

func (router *Router) Listen() error

Listen start listening on the provided port blocking

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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