2015-10-21 1 views
0

Je souhaite effectuer une opération de récupération. Je suis passng nom comme une ressource à l'URL. L'URL Je frappais en Postman est: localhost:8080/location/{titan rolex} (j'ai choisi la méthode GET dans la liste déroulante) Sur l'URL frappé dans Postman, j'exécute la func() getUser avec corps:Comment traiter l'opération GET (CRUD) dans go lang via Postman?

func GetUser(rw http.ResponseWriter, req *http.Request) { 

} 

maintenant Je souhaite obtenir la valeur de la ressource à savoir 'titan rolex' dans la méthode GetUser. Comment puis-je y parvenir en golang?

En main(), j'ai ceci:

http.HandleFunc("/location/{titan rolex}", GetUser) 

Merci à l'avance.

Répondre

0

Ce que vous faites est de lier complet chemin /location/{titan rolex} à être géré par GetUser. Ce que vous voulez vraiment, c'est lier /location/<every possible string> pour être manipulé par un manipulateur (par exemple LocationHandler)

Vous pouvez le faire avec la bibliothèque standard ou un autre routeur. Je présenterai dans les deux sens:

  1. lib Standard:

    import (
        "fmt" 
        "net/http" 
        "log" 
    ) 
    
    func locationHandler(w http.ResponseWriter, r *http.Request) { 
        name := r.URL.Path[len("/location/"):] 
        fmt.Fprintf(w, "Location: %s\n", name) 
    } 
    
    func main() { 
        http.HandleFunc("/location/", locationHandler) 
        log.Fatal(http.ListenAndServe(":8080", nil)) 
    } 
    

    Notez cependant, sera fastidieux des chemins plus complexes (par exemple /location/<every possible string>/<some int>/<another string>) pour mettre en œuvre cette façon.

  2. L'autre façon est d'utiliser github.com/julienschmidt/httprouter, surtout si vous rencontrez ces situations plus souvent (et avez des chemins plus complexes).

    Voici un exemple pour votre cas d'utilisation:

    import (
        "fmt" 
        "github.com/julienschmidt/httprouter" 
        "net/http" 
        "log" 
    ) 
    
    func LocationHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { 
        fmt.Fprintf(w, "Location: %s\n", ps.ByName("loc")) 
    } 
    
    func main() { 
        router := httprouter.New() 
        router.GET("/location/:loc", LocationHandler) 
    
        log.Fatal(http.ListenAndServe(":8080", router)) 
    } 
    

    Notez que httprouter utilise une signature légèrement différente pour les gestionnaires. C'est parce que, comme vous pouvez le voir, il transmet également ces paramètres aux fonctions.

Oh et une autre note, vous pouvez simplement frapper http://localhost:8080/location/titan rolex avec votre navigateur (ou autre) - si ce quelque chose d'autre est assez décent, il UrlEncode que pour être http://localhost:8080/location/titan%20rolex.

+0

Merci beaucoup pour les idées @ mrd0ll4r. Je suis capable d'aller chercher les données maintenant. Donc, fondamentalement, je pense que r.GET est une meilleure option que HnadleFunc. –

+0

C'est essentiellement la même chose - ce que j'ai fait était d'ajouter le 'httprouter' entre, qui décide quel gestionnaire à utiliser. – mrd0ll4r

+1

@ mrd0ll4r la façon de le faire avec juste la std lib est d'enregistrer un gestionnaire pour '/ location /' qui correspondra à un court exemple '/ location/titan rolex' http://play.golang.org/p/fyJVDqL2Ox long exemple https://golang.org/doc/articles/wiki/ – jcbwlkr