quick

package module
v0.0.0-...-72bb790 Latest Latest
Warning

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

Go to latest
Published: Dec 1, 2023 License: MIT Imports: 14 Imported by: 7

README

Logo do Quick

GoDoc Github Release CircleCI Go Report License CircleCI Coveralls

Quick Route Go Logo do Quick

🚀 O Quick é um gerenciador de rotas flexível e extensível para a linguagem Go. Seu objetivo é ser rápido e de alto desempenho, além de ser 100% compatível com net/http. O Quick é um projeto em constante desenvolvimento e está aberto para colaboração, todos são bem-vindos para contribuir. 😍

💡 Se você é novo na programação, o Quick é uma ótima oportunidade para começar a aprender a trabalhar com Go. Com sua facilidade de uso e recursos, você pode criar rotas personalizadas e expandir seu conhecimento na linguagem.

👍 Espero que possam participar e que gostem de Godar!!! 😍

🔍 O repositório de exemplos do Framework Quick Exemplos Quick.

🗺️| Rodmap do desenvolvimento

Tarefa Progresso
Desenvolver MaxBodySize metodos Post e Put 100%
Desenvolver Padrão de Testes Unitários 90%
Desenvolver Config em New(Config{}) não obrigatório 100%
Desenvolve suporte a Grupo de Rotas - Group Get e Post 70%
Desenvolver e relacionar ao Listen o Config 30%
Criação de função print para não usar fmt de forma demasiada 100%
Criação de função própria para Concat String 100%
Criação de benchmarking entre os.Stdout e fmt.Println 100%
Desenvolver Routes Método GET 100%
Desenvolver Routes Método GET aceitando Query String 100%
Desenvolver Routes Método GET aceitando Parametros 100%
Desenvolver Routes Método GET aceitando Query String e Parametros 100%
Desenvolver Routes Método GET aceitando expressão regular 100.%
Desenvolver Routes Método POST 100%
Desenvolver Routes Método POST aceitando JSON 100%
Desenvolver para o MÉTODO POST o parse JSON 100%
Desenvolver para o MÉTODO POST funções para acessar byte ou string do Parse 100%
Desenvolver para o MÉTODO PUT 100%
Desenvolver para o MÉTODO PUT o parse JSON 100%
Desenvolver para o MÉTODO PUT o parse JSON 100%
Desenvolver para o MÉTODO PUT funções para acessar byte ou string do Parse 100%
Desenvolver para o MÉTODO DELETE 100%
Desenvolver para o MÉTODO OPTIONS 0.%
Desenvolver para o MÉTODO CONNECT Veja mais 0.%
Desenvolver método para ListenAndServe 100%
Desenvolver método para ListenAndServeTLS (http2) 0.%
Desenvolver método para Facilitar a manipulação do ResponseWriter 80%
Desenvolver método para Facilitar a manipulação do Request 80%
Desenvolver suporte a ServeHTTP 100%
Desenvolver suporte a middlewares 100%
Desenvolver suporte a middleware compress 100%
Desenvolver suporte a middlewares cors 100%
Desenvolver suporte a middlewares logger 100%
Desenvolver suporte a middlewares maxbody 100%
Desenvolver suporte a middlewares msgid 100%
Desenvolver suporte a middlewares msguuid 100%
Desenvolve suporte Static Files 0.%
Desenvolver suporte Cors 100.%
Desenvolver suporte Cient Get 100.%
Desenvolver suporte Cient Post 100.%
Desenvolver suporte Cient Put 100.%
Desenvolver suporte Cient Delete 100.%
Desenvolver suporte Cient Fast Get 90.%
Desenvolver suporte Cient Fast Post 80.%
Desenvolver suporte Cient Fast Put 80.%
Desenvolver suporte Cient Fast Delete 80.%
Primeiro exemplo Quick

package main

import "github.com/jeffotoni/quick"

func main() {
    q := quick.New()

    q.Get("/v1/user", func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")
        return c.Status(200).SendString("Quick em ação ❤️!")
    })

    q.Listen("0.0.0.0:8080")
}


$ curl -i -XGET -H "Content-Type:application/json" \
'localhost:8080/v1/user'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 22 Feb 2023 07:45:36 GMT
Content-Length: 23

Quick em ação ❤️!

Quick Get Params

package main

import "github.com/jeffotoni/quick"

func main() {
    q := quick.New()

    q.Get("/v1/customer/:param1/:param2", func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")

        type my struct {
            Msg string `json:"msg"`
            Key string `json:"key"`
            Val string `json:"val"`
        }

        return c.Status(200).JSON(&my{
            Msg: "Quick ❤️",
            Key: c.Param("param1"),
            Val: c.Param("param2"),
        })
    })

    q.Listen("0.0.0.0:8080")
}


$ curl -i -XGET -H "Content-Type:application/json" \
'localhost:8080/v1/customer/val1/val2'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 22 Feb 2023 07:45:36 GMT
Content-Length: 23

{"msg":"Quick ❤️","key":"val1","val":"val2"}

Quick Post Body json

package main

import "github.com/jeffotoni/quick"

type My struct {
    Name string `json:"name"`
    Year int    `json:"year"`
}

func main() {
    q := quick.New()
    q.Post("/v1/user", func(c *quick.Ctx) error {
        var my My
        err := c.BodyParser(&my)
        if err != nil {
            return c.Status(400).SendString(err.Error())
        }

        return c.Status(200).String(c.BodyString())
        // ou 
        // c.Status(200).JSON(&my)
    })

    q.Listen("0.0.0.0:8080")
}


$ curl -i -XPOST -H "Content-Type:application/json" \
'localhost:8080/v1/user' \
-d '{"name":"jeffotoni", "year":1990}'
HTTP/1.1 200 OK
Date: Wed, 22 Feb 2023 08:10:06 GMT
Content-Length: 32
Content-Type: text/plain; charset=utf-8

{"name":"jeffotoni","year":1990}

🎛️| Funcionalidades

Funcionalidades Possui
🛣️ Gerenciador de Rotas sim
📁 Server Files Static sim
🚪 Grupo de Rotas sim
🌐 Middlewares sim
🚀 HTTP/2 support sim
🧬 Data binding for JSON, XML and form payload sim
🔍 Suporte para regex sim

📚| Examples

Este repositório contém exemplos práticos do Framework Quick, um framework web rápido e leve, desenvolvido em Go. Os exemplos estão organizados em pastas separadas, cada uma contendo um exemplo completo de uso do framework em uma aplicação web simples. Se você tem algum exemplo interessante de uso do Framework Quick, sinta-se à vontade para enviar uma solicitação de pull request com sua contribuição. O repositório de exemplos do Framework Quick pode ser encontrado em aqui.

Quick Post Bind json

package main

import "github.com/jeffotoni/quick"

type My struct {
    Name string `json:"name"`
    Year int    `json:"year"`
}

func main() {
    q := quick.New()
    q.Post("/v2/user", func(c *quick.Ctx) error {
        var my My
        err := c.Bind(&my)
        if err != nil {
            return c.Status(400).SendString(err.Error())
        }
        return c.Status(200).JSON(&my)
    })

    q.Listen("0.0.0.0:8080")
}


$ curl -i -XPOST -H "Content-Type:application/json" \
'localhost:8080/v2/user' \
-d '{"name":"Marcos", "year":1990}'
HTTP/1.1 200 OK
Date: Wed, 22 Feb 2023 08:10:06 GMT
Content-Length: 32
Content-Type: text/plain; charset=utf-8

{"name":"Marcos","year":1990}

Cors

package main

import (
    "github.com/jeffotoni/quick"
    "github.com/jeffotoni/quick/middleware/cors"
)

func main() {
    q := quick.New()
    q.Use(cors.New())

    q.Get("/v1/user", func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")
        return c.Status(200).SendString("Quick em ação com Cors❤️!")
    })

    q.Listen("0.0.0.0:8080")
}

quick.New(quick.Config{})

package main

import "github.com/jeffotoni/quick"

func main() {
    q := quick.New(quick.Config{
        MaxBodySize: 5 * 1024 * 1024,
    })

    q.Get("/v1/user", func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")
        return c.Status(200).SendString("Quick em ação com Cors❤️!")
    })

    q.Listen("0.0.0.0:8080")
}

quick.Group()
package main

import "github.com/jeffotoni/quick"

func main() {
    q := quick.New(quick.Config{
        MaxBodySize: 5 * 1024 * 1024,
    })

    v1 := q.Group("/v1")
    v1.Get("/user", func(c *quick.Ctx) error {
        return c.Status(200).SendString("[GET] [GROUP] /v1/user ok!!!")
    })
    v1.Post("/user", func(c *quick.Ctx) error {
        return c.Status(200).SendString("[POST] [GROUP] /v1/user ok!!!")
    })

    v2 := q.Group("/v2")
    v2.Get("/user", func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")
        return c.Status(200).SendString("Quick em ação com [GET] /v2/user ❤️!")
    })

    v2.Post("/user", func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")
        return c.Status(200).SendString("Quick em ação com [POST] /v2/user ❤️!")
    })

    q.Listen("0.0.0.0:8080")
}

Quick Tests

package main

import (
    "io"
    "strings"
    "testing"

    "github.com/jeffotoni/quick"
)

func TestQuickExample(t *testing.T) {

    // Here is a handler function Mock
    testSuccessMockHandler := func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")
        b, _ := io.ReadAll(c.Request.Body)
        resp := `"data":` + string(b)
        return c.Byte([]byte(resp))
    }

    q := quick.New()
    // Here you can create all routes that you want to test
    q.Post("/v1/user", testSuccessMockHandler)
    q.Post("/v1/user/:p1", testSuccessMockHandler)

    wantOutData := `"data":{"name":"jeff", "age":35}`
    reqBody := []byte(`{"name":"jeff", "age":35}`)
    reqHeaders := map[string]string{"Content-Type": "application/json"}

    data, err := q.QuickTest("POST", "/v1/user", reqHeaders, reqBody)
    if err != nil {
        t.Errorf("error: %v", err)
        return
    }

    s := strings.TrimSpace(data.BodyStr())
    if s != wantOutData {
        t.Errorf("was suppose to return %s and %s come", wantOutData, s)
        return
    }

    t.Logf("\nOutputBodyString -> %v", data.BodyStr())
    t.Logf("\nStatusCode -> %d", data.StatusCode())
    t.Logf("\nOutputBody -> %v", string(data.Body())) // I have converted in this example to string but comes []byte as default
    t.Logf("\nResponse -> %v", data.Response())
}

quick.regex

package main

import (
    "github.com/jeffotoni/quick"
    "github.com/jeffotoni/quick/middleware/msgid"
)

func main() {
    q := quick.New()

    q.Use(msgid.New())

    q.Get("/v1/user/{id:[0-9]+}", func(c *quick.Ctx) error {
        c.Set("Content-Type", "application/json")
        return c.Status(200).String("Quick ação total!!!")
    })

    q.Listen("0.0.0.0:8080")
}

🤝| Contribuições

Já temos diversos exemplos, e já podemos testar e brincar 😁. É claro, estamos no início, ainda tem muito para fazer. Fiquem à vontade em fazer PR (com risco de ganhar uma camiseta Go ❤️ e claro reconhecimento como profissional Go 😍 no mercado de trabalho).

🚀 Apoiadores do Projeto Quick 🙏

O Projeto Quick visa desenvolver e disponibilizar softwares de qualidade para a comunidade de desenvolvedores. 💻 Para continuarmos a melhorar nossas ferramentas, contamos com o apoio de nossos patrocinadores no Patreon. 🤝

Agradecemos a todos os nossos apoiadores! 🙌 Se você também acredita em nosso trabalho e quer contribuir para o avanço da comunidade de desenvolvimento, considere apoiar o Projeto Quick em nosso Patreon aqui

Juntos podemos continuar a construir ferramentas incríveis! 🚀

Avatar User Donation
@jeffotoni x 10
@Crow3442 x 5
@Guilherme-De-Marchi x 5

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 9110, 15.2.1
	StatusSwitchingProtocols = 101 // RFC 9110, 15.2.2
	StatusProcessing         = 102 // RFC 2518, 10.1
	StatusEarlyHints         = 103 // RFC 8297

	StatusOK                   = 200 // RFC 9110, 15.3.1
	StatusCreated              = 201 // RFC 9110, 15.3.2
	StatusAccepted             = 202 // RFC 9110, 15.3.3
	StatusNonAuthoritativeInfo = 203 // RFC 9110, 15.3.4
	StatusNoContent            = 204 // RFC 9110, 15.3.5
	StatusResetContent         = 205 // RFC 9110, 15.3.6
	StatusPartialContent       = 206 // RFC 9110, 15.3.7
	StatusMultiStatus          = 207 // RFC 4918, 11.1
	StatusAlreadyReported      = 208 // RFC 5842, 7.1
	StatusIMUsed               = 226 // RFC 3229, 10.4.1

	StatusMultipleChoices  = 300 // RFC 9110, 15.4.1
	StatusMovedPermanently = 301 // RFC 9110, 15.4.2
	StatusFound            = 302 // RFC 9110, 15.4.3
	StatusSeeOther         = 303 // RFC 9110, 15.4.4
	StatusNotModified      = 304 // RFC 9110, 15.4.5
	StatusUseProxy         = 305 // RFC 9110, 15.4.6

	StatusTemporaryRedirect = 307 // RFC 9110, 15.4.8
	StatusPermanentRedirect = 308 // RFC 9110, 15.4.9

	StatusBadRequest                   = 400 // RFC 9110, 15.5.1
	StatusUnauthorized                 = 401 // RFC 9110, 15.5.2
	StatusPaymentRequired              = 402 // RFC 9110, 15.5.3
	StatusForbidden                    = 403 // RFC 9110, 15.5.4
	StatusNotFound                     = 404 // RFC 9110, 15.5.5
	StatusMethodNotAllowed             = 405 // RFC 9110, 15.5.6
	StatusNotAcceptable                = 406 // RFC 9110, 15.5.7
	StatusProxyAuthRequired            = 407 // RFC 9110, 15.5.8
	StatusRequestTimeout               = 408 // RFC 9110, 15.5.9
	StatusConflict                     = 409 // RFC 9110, 15.5.10
	StatusGone                         = 410 // RFC 9110, 15.5.11
	StatusLengthRequired               = 411 // RFC 9110, 15.5.12
	StatusPreconditionFailed           = 412 // RFC 9110, 15.5.13
	StatusRequestEntityTooLarge        = 413 // RFC 9110, 15.5.14
	StatusRequestURITooLong            = 414 // RFC 9110, 15.5.15
	StatusUnsupportedMediaType         = 415 // RFC 9110, 15.5.16
	StatusRequestedRangeNotSatisfiable = 416 // RFC 9110, 15.5.17
	StatusExpectationFailed            = 417 // RFC 9110, 15.5.18
	StatusTeapot                       = 418 // RFC 9110, 15.5.19 (Unused)
	StatusMisdirectedRequest           = 421 // RFC 9110, 15.5.20
	StatusUnprocessableEntity          = 422 // RFC 9110, 15.5.21
	StatusLocked                       = 423 // RFC 4918, 11.3
	StatusFailedDependency             = 424 // RFC 4918, 11.4
	StatusTooEarly                     = 425 // RFC 8470, 5.2.
	StatusUpgradeRequired              = 426 // RFC 9110, 15.5.22
	StatusPreconditionRequired         = 428 // RFC 6585, 3
	StatusTooManyRequests              = 429 // RFC 6585, 4
	StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

	StatusInternalServerError           = 500 // RFC 9110, 15.6.1
	StatusNotImplemented                = 501 // RFC 9110, 15.6.2
	StatusBadGateway                    = 502 // RFC 9110, 15.6.3
	StatusServiceUnavailable            = 503 // RFC 9110, 15.6.4
	StatusGatewayTimeout                = 504 // RFC 9110, 15.6.5
	StatusHTTPVersionNotSupported       = 505 // RFC 9110, 15.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

View Source
const (
	ContentTypeAppJSON = `application/json`
	ContentTypeAppXML  = `application/xml`
	ContentTypeTextXML = `text/xml`
)

Variables

This section is empty.

Functions

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 Config

type Config struct {
	BodyLimit         int64
	MaxBodySize       int64
	MaxHeaderBytes    int64
	RouteCapacity     int
	MoreRequests      int // 0 a 1000
	ReadTimeout       time.Duration
	WriteTimeout      time.Duration
	IdleTimeout       time.Duration
	ReadHeaderTimeout time.Duration
}

type Ctx

type Ctx struct {
	Response http.ResponseWriter
	Request  *http.Request

	MoreRequests int

	JsonStr string
	Headers map[string][]string
	Params  map[string]string
	Query   map[string]string
	// contains filtered or unexported fields
}

func (*Ctx) Accepts

func (c *Ctx) Accepts(acceptType string) *Ctx

func (*Ctx) Append

func (c *Ctx) Append(key, value string)

func (*Ctx) Bind

func (c *Ctx) Bind(v interface{}) (err error)

func (*Ctx) Body

func (c *Ctx) Body() []byte

func (*Ctx) BodyParser

func (c *Ctx) BodyParser(v interface{}) (err error)

func (*Ctx) BodyString

func (c *Ctx) BodyString() string

func (*Ctx) Byte

func (c *Ctx) Byte(b []byte) (err error)

func (*Ctx) JSON

func (c *Ctx) JSON(v interface{}) error

func (*Ctx) Param

func (c *Ctx) Param(key string) string

func (*Ctx) Send

func (c *Ctx) Send(b []byte) (err error)

func (*Ctx) SendFile

func (c *Ctx) SendFile(file []byte) error

func (*Ctx) SendString

func (c *Ctx) SendString(s string) error

func (*Ctx) Set

func (c *Ctx) Set(key, value string)

func (*Ctx) Status

func (c *Ctx) Status(status int) *Ctx

func (*Ctx) String

func (c *Ctx) String(s string) error

func (*Ctx) XML

func (c *Ctx) XML(v interface{}) error

type Group

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

func (*Group) Delete

func (g *Group) Delete(pattern string, handlerFunc HandleFunc)

func (*Group) Get

func (g *Group) Get(pattern string, handlerFunc HandleFunc)

func (*Group) Post

func (g *Group) Post(pattern string, handlerFunc HandleFunc)

func (*Group) Put

func (g *Group) Put(pattern string, handlerFunc HandleFunc)

type HandleFunc

type HandleFunc func(*Ctx) error

type Quick

type Quick struct {
	Cors bool

	CorsSet     func(http.Handler) http.Handler
	CorsOptions map[string]string
	// contains filtered or unexported fields
}

func New

func New(c ...Config) *Quick

func (*Quick) Delete

func (q *Quick) Delete(pattern string, handlerFunc HandleFunc)

func (*Quick) Get

func (q *Quick) Get(pattern string, handlerFunc HandleFunc)

func (*Quick) GetRoute

func (q *Quick) GetRoute() []*Route

func (*Quick) Group

func (q *Quick) Group(prefix string) *Group

func (*Quick) Listen

func (q *Quick) Listen(addr string, handler ...http.Handler) error

func (*Quick) Post

func (q *Quick) Post(pattern string, handlerFunc HandleFunc)

func (*Quick) Put

func (q *Quick) Put(pattern string, handlerFunc HandleFunc)

func (Quick) QuickTest

func (q Quick) QuickTest(method, URI string, headers map[string]string, body ...[]byte) (QuickTestReturn, error)

QuickTest: This Method is a helper function to make tests with quick more quickly Required Params: Method (GET, POST, PUT, DELETE...), URI (only the path. Example: /test/:myParam) Optional Param: Body (If you don't want to define one, just ignore)

func (*Quick) ServeHTTP

func (q *Quick) ServeHTTP(w http.ResponseWriter, req *http.Request)

func (*Quick) Static

func (q *Quick) Static(staticFolder string)

func (*Quick) Use

func (q *Quick) Use(mw any, nf ...string)

type QuickMockCtx

type QuickMockCtx interface {
	Get(URI string) error
	Post(URI string, body []byte) error
	Put(URI string, body []byte) error
	Delete(URI string) error
}

func QuickMockCtxJSON

func QuickMockCtxJSON(ctx *Ctx, params map[string]string) QuickMockCtx

func QuickMockCtxXML

func QuickMockCtxXML(ctx *Ctx, params map[string]string, contentType string) QuickMockCtx

type QuickMockTestServer

type QuickMockTestServer struct {
	Client  *http.Client
	Port    int
	URI     string
	Method  string
	Headers map[string]string
	Body    []byte
}

type QuickTestReturn

type QuickTestReturn interface {
	Body() []byte
	BodyStr() string
	StatusCode() int
	Response() *http.Response
}

type Route

type Route struct {
	//Pattern *regexp.Regexp
	Group   string
	Pattern string
	Path    string
	Params  string
	Method  string
	// contains filtered or unexported fields
}

type Zeroth

type Zeroth int
const (
	Zero Zeroth = 0
)

Directories

Path Synopsis
internal
log
qos
middleware

Jump to

Keyboard shortcuts

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