Comment servir une réponse JSON à l'aide de Go?
Question: Actuellement, je suis en imprimant ma réponse dans le func Index
comme ce fmt.Fprintf(w, string(response))
cependant, comment puis-je envoyer JSON correctement à la demande, de sorte qu'il peut être consommé par un point de vue?
package main
import (
"fmt"
"github.com/julienschmidt/httprouter"
"net/http"
"log"
"encoding/json"
)
type Payload struct {
Stuff Data
}
type Data struct {
Fruit Fruits
Veggies Vegetables
}
type Fruits map[string]int
type Vegetables map[string]int
func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
response, err := getJsonResponse();
if err != nil {
panic(err)
}
fmt.Fprintf(w, string(response))
}
func main() {
router := httprouter.New()
router.GET("/", Index)
log.Fatal(http.ListenAndServe(":8080", router))
}
func getJsonResponse()([]byte, error) {
fruits := make(map[string]int)
fruits["Apples"] = 25
fruits["Oranges"] = 10
vegetables := make(map[string]int)
vegetables["Carrats"] = 10
vegetables["Beets"] = 0
d := Data{fruits, vegetables}
p := Payload{d}
return json.MarshalIndent(p, "", " ")
}
- github.com/unrolled/render peut aussi aider.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir votre type de contenu d'en-tête afin que les clients sachent à attendre json
w.Header().Set("Content-Type", "application/json")
Une autre façon d'organiser une structure json est de construire un codeur à l'aide de la
http.ResponseWriter
w.Header().Set("Content-Type", "application/json")
est correct pour le réglage du type de contenu, il n'est pas lors de l'utilisation dejson.NewEncoder
au lieu de cela, je reçois un txt/plaine de résultat. Est ce que quelqu'un d'autre se présente. La réponse de @poorva a fonctionné comme prévuw.WriteHeader(http.StatusOk)
- je obtenir le résultat ci-dessus.w.WriteHeader(http.StatusOk)
puis-je obtenirtext/plain; charset=utf-8
, si je n'ai pas de définir l'État-Code explicitement-je obtenirapplicaton/json
et la Réponse a toujours un Status-Code 200.Changing the header map after a call to WriteHeader (or Write) has no effect unless the modified headers are trailers.
w.Header().Set("Content-Type", "application/json")
ci-dessusjson.NewEncoder(w).Encode(p)
de travail pour moiD'autres utilisateurs de commenter ce que l'
Content-Type
estplain/text
lors de l'encodage. Vous devez définir leContent-Type
premièrew.Header().Set
, puis le code de réponse HTTPw.WriteHeader
.Si vous appelez
w.WriteHeader
d'abord, puis appelw.Header().Set
après, vous obtiendrezplain/text
.Un exemple de gestionnaire pourrait ressembler à ceci;
Vous pouvez faire quelque chose comme cela en vous
getJsonResponse
fonction -jData
, éventuellement inutilement.Data
peut être de taille arbitraire, selon les données rassemblées, ce qui pourrait être un non-trivial de mémoire gaspilleur. Après regroupement, nous avons copie de la mémoire à laResponseWriter
flux. La réponse qui utilise json.NewEncoder (), etc. écrire le muselé JSON directement dans leResponseWriter
(dans son courant ..)Encoder.Encode()
fonctionDans gobuffalo.io cadre je l'ai eu à travailler comme ça:
et puis quand je veux obtenir de réponse JSON pour cette ressource, je dois mettre "Content-type", "application/json", et cela fonctionne.
Je pense que Rails est plus pratique pour gérer plusieurs types de réponse, je n'ai pas vu le même dans gobuffalo jusqu'à présent.
Vous pouvez utiliser ce package moteur de rendu, j'ai écrit pour résoudre ce genre de problème, il est un wrapper pour servir JSON, JSONP, XML, HTML, etc ...