desenvolvendo apis em go usando middlewares

17
Desenvolvendo APIs usando middlewares Elton Minetto @eminetto http://eltonminetto.net http://asemanago.com.br [email protected]

Upload: elton-minetto

Post on 16-Apr-2017

516 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Desenvolvendo APIs em Go usando Middlewares

DesenvolvendoAPIs usandomiddlewaresElton Minetto

@eminettohttp://eltonminetto.nethttp://[email protected]

Page 2: Desenvolvendo APIs em Go usando Middlewares

Http Is The Foundation

Of The Web

Page 3: Desenvolvendo APIs em Go usando Middlewares

Um cliente manda uma request

r.Method - HTTP method (GET, POST, PUT, PATCH, DELETE etc.)r.URL.Path - Request path (/things/123)r.URL.String() - Full URLr.URL.Query() - Query parameters (q=something&p=2)r.Body - io.ReadCloser of the request body

Page 4: Desenvolvendo APIs em Go usando Middlewares

O servidor retorna uma response

type ResponseWriter interface {

Header() Header Write([]byte) (int, error) WriteHeader(int)

}

Page 5: Desenvolvendo APIs em Go usando Middlewares

Middlewares

Page 6: Desenvolvendo APIs em Go usando Middlewares

Between the request and response

Enrico Zimuel

HTTP middleware is not for your Domain work. The middleware is a path in to, and out of, the core Domain.

Paul M. Jones

Run code before and after handler code

Mat Ryer

Page 7: Desenvolvendo APIs em Go usando Middlewares
Page 8: Desenvolvendo APIs em Go usando Middlewares

Exemplos

Page 9: Desenvolvendo APIs em Go usando Middlewares

func middlewareOne(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println("Executing before middlewareOne") next.ServeHTTP(w, r) log.Println("Executing after middlewareOne") })}

Page 10: Desenvolvendo APIs em Go usando Middlewares

func middlewareTwo(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println("Executing before middlewareTwo") if r.URL.Path != "/" { return } next.ServeHTTP(w, r) log.Println("Executing after middlewareTwo") })}

func final(w http.ResponseWriter, r *http.Request) { log.Println("Executing finalHandler") w.Write([]byte("OK"))}

Page 11: Desenvolvendo APIs em Go usando Middlewares

func main() { finalHandler := http.HandlerFunc(final) http.Handle("/", middlewareOne(middlewareTwo(finalHandler))) http.ListenAndServe(":8000", nil)}

Page 12: Desenvolvendo APIs em Go usando Middlewares

https://github.com/justinas/alice

Page 13: Desenvolvendo APIs em Go usando Middlewares

func main() { finalHandler := http.HandlerFunc(final) chain := alice.New(middlewareOne, middlewareTwo).Then(finalHandler) http.ListenAndServe(":8000", chain)}

Page 14: Desenvolvendo APIs em Go usando Middlewares

package main

import ( "github.com/justinas/alice" "net/http" "planrockr")

func getCurrentSubscription(w http.ResponseWriter, r *http.Request) { ...}

func main() { chain := alice.New(planrockr.Auth, planrockr.GetUserByToken). Then(http.HandlerFunc(getCurrentSubscription)) http.ListenAndServe(":8000", chain)}

Page 15: Desenvolvendo APIs em Go usando Middlewares

package main

import ( "github.com/justinas/alice" "net/http" "planrockr")

func processEvent(next http.Handler) http.Handler { ...}

func main() { chain := alice.New(processEvent, planrockr.ValidateHookData). Then(http.HandlerFunc(planrockr.Enqueue)) http.ListenAndServe(":8000", chain)}

Page 17: Desenvolvendo APIs em Go usando Middlewares

Contato@eminettohttp://eltonminetto.nethttp://[email protected]