Criando um servidor REST com GO

소개



Hoje aprendi a criar servidores REST com o GO, e logo de cara fiquei impressionado pois não precisioni instalar nenhuma lib externa para subir o servidor, o GO já vem por padrão com módulos responsáveis ​​por isso

구현



De inicio precisioni declarar uma struct que recebe a seguinte função

func (w WebServer) Serve() {
    server := &http.Server{
        ReadHeaderTimeout: 10 * time.Second, // tempo de timeout para leitura
        WriteTimeout:      10 * time.Second, // tempo de timeout para escrita
        Addr:              ":8080", //porta da aplicação
        Handler:           nil, // handler da aplicação
        ErrorLog:          log.New(os.Stderr, "log: ", log.Lshortfile), // como será tratado o log da aplicação
    }

    err := server.ListenAndServe()
    if err != nil {
        log.Fatal(err) //caso tenha um erro na parte de servir paro a aplicação e coloco esse erro no log
    }
}


Depois disso precisioni instalar a biblioteca github.com/gorilla/mux para fazer a parte das rotas que não vem com a biblioteca padrão do GO
e biblioteca github.com/codegangsta/negroni 중간 구현 미들웨어, Nesse caso o 미들웨어 로그



E para fazer as rotas vai ser da seguinte forma

func MakeProductHandlers(r *mux.Router, n *negroni.Negroni, service application.ProductServiceInterface) {
    r.Handle("/product/{id}", n.With(
        negroni.Wrap(getProduct(service)),
    )).Methods("GET", "OPTIONS")
}


O handler vai servir como um controller para pegar as requisições para a rota e a função getProduct vai ficar assim

func getProduct(service application.ProductServiceInterface) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        vars := mux.Vars(r)
        id := vars["id"]

        product, err := service.Get(id)
        if err != nil {
            w.WriteHeader(http.StatusNotFound)
            return
        }

        err = json.NewEncoder(w).Encode(product)
        if err != nil {
            w.WriteHeader(http.StatusInternalServerError)
            return
        }

    })
}


então quando o usuário chamar a rota /product/{id} o 핸들러 vai chamar a função getProducts e o Negroni vai rodar junto pois usei o wrap ao redor da função getProducts, ai a função getProduct vai ter um request e um responseWritter o request usamos para pegar os dados que o clienten enviou na requisição e o responseWritter e para escrever a resposta e mandar de volta para o usuário, que é quando uso o json.NewEncoder(w).Encode(product) , para já mandar os dados formatados no formato de json

Para iniciar o servidor criei um novo commando com o cobra cli chamado de http e nesse comando fiz o seguinte

        s := server.MakeNewWebServer()
        s.Service = &productService
        fmt.Println("Web server is running on port 8080")
        s.Serve()


Esse product service é apenas a conexão com o banco de dados não precisa se preocupar com ele, mas se quiser ver. Código completo ele está no meu Github.

Agora temos um webServer completeto

좋은 웹페이지 즐겨찾기