Go: RESTful - método POST e uso do JSON

De Aulas

Afluentes: Sistemas Distribuídos e Mobile

Método POST e JSON

No exemplo a seguir estamos trabalhando agora com uma estrutura de objeto JSON. Nossa estrutura possui três variáveis do tipo string, sendo elas o Id, Name e Email. Observe que essas variáveis iniciam com a letra maiúscula, sendo que significa que são atributos públicos da nossa struct, ou se preferir pode chamar de Objeto.

Outra coisa importante é avisar ao nosso código que essas informações serão usadas para gerar o objeto JSON, assim como também precisamos declarar um nome. Isso é feito logo após a declaração do atributo. Por exemplo:

Name    string `json:"name"`

Informamos assim que no objeto JSON a ser criado, o nome da informação será name. O nome pode ser diferente do atributo do objeto declarado na nossa struct.

Veja que agora também temos uma outra coisa a fazer. Vamos declarar que nosso pacote é do tipo JSON e UTF-8, tal como a linha abaixo:

w.Header().Set("Content-Type", "application/json;charset=UTF-8")

Podemos fazer isso logo no início da função que trata o método.

Dessa forma, a aplicação que vai consumir nosso serviço web vai saber como tratar a informação de forma mais específica.

package main

import (
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/rs/cors"
)

type User struct {
	Id    string `json:"id"`
	Name  string `json:"name"`
	Email string `json:"email"`
}

func main() {
	var user User

	router := http.NewServeMux()

	router.HandleFunc("GET /info", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json;charset=UTF-8")
		json.NewEncoder(w).Encode(user)
	})

	router.HandleFunc("POST /info", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json;charset=UTF-8")
		err := json.NewDecoder(r.Body).Decode(&user)
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
	})

	c := cors.AllowAll()
	r := c.Handler(router)

	err := http.ListenAndServe("localhost:8080", r)
	if err != nil {
		fmt.Println(err.Error())
	}
}

Atividade

  • Para o exemplo acima, crie as funções para tratar os métodos DELETE.