287 votes

Gestion des requêtes post JSON en Go

J'ai donc ce qui suit, qui semble incroyablement bricolé, et je me suis dit que Go avait des bibliothèques mieux conçues que ça, mais je n'arrive pas à trouver un exemple de Go gérant une requête POST de données JSON. Ce sont tous des POST de formulaire.

Voici un exemple de demande : curl -X POST -d "{\"test\": \"that\"}" http://localhost:8082/test

Et voici le code, avec les logs incorporés :

package main

import (
    "encoding/json"
    "log"
    "net/http"
)

type test_struct struct {
    Test string
}

func test(rw http.ResponseWriter, req *http.Request) {
    req.ParseForm()
    log.Println(req.Form)
    //LOG: map[{"test": "that"}:[]]
    var t test_struct
    for key, _ := range req.Form {
        log.Println(key)
        //LOG: {"test": "that"}
        err := json.Unmarshal([]byte(key), &t)
        if err != nil {
            log.Println(err.Error())
        }
    }
    log.Println(t.Test)
    //LOG: that
}

func main() {
    http.HandleFunc("/test", test)
    log.Fatal(http.ListenAndServe(":8082", nil))
}

Il doit y avoir un meilleur moyen, non ? J'ai juste du mal à trouver quelle pourrait être la meilleure pratique.

(Go est également connu sous le nom de Golang par les moteurs de recherche, et mentionné ici pour que d'autres puissent le trouver).

3 votes

Si vous utilisez curl -X POST -H 'Content-Type: application/json' -d "{\"test\": \"that\"}" entonces req.Form["test"] devrait retourner "that"

0 votes

@Vinicius y a-t-il des preuves de cela ?

4voto

type test struct {
    Test string `json:"test"`
}

func test(w http.ResponseWriter, req *http.Request) {
    var t test_struct

    body, _ := ioutil.ReadAll(req.Body)
    json.Unmarshal(body, &t)

    fmt.Println(t)
}

3voto

Amin Shojaei Points 11

J'aime définir des structures personnalisées localement. Donc :

// my handler func
func addImage(w http.ResponseWriter, r *http.Request) {

    // define custom type
    type Input struct {
        Url        string  `json:"url"`
        Name       string  `json:"name"`
        Priority   int8    `json:"priority"`
    }

    // define a var 
    var input Input

    // decode input or return error
    err := json.NewDecoder(r.Body).Decode(&input)
    if err != nil {
        w.WriteHeader(400)
        fmt.Fprintf(w, "Decode error! please check your JSON formating.")
        return
    }

    // print user inputs
    fmt.Fprintf(w, "Inputed name: %s", input.Name)

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X