2017-03-29 3 views
1

J'ai essayé de configurer un fichier de configuration JSON pour configurer les routes dynamiques pour mon application. L'idée est que je serai en mesure de configurer ma propre structure d'URL en fonction de qui utilise le service. J'ai une structure qui accepte JSON et ça marche bien. J'utilise gorilla mux. Le JSON est fondamentalement identique à la struct et va bien.Config Golson JSON pour les routes

Le problème que j'ai est d'obtenir la section HandleFunc.

Voici le code:

func NewRouter() *mux.Router { 

routerInstance := mux.NewRouter().StrictSlash(true) 

    /* 
    All routes from the routing table 
    */ 

    // r = []CustomRoute with the JSON data 
    r := loadRoute() 
    for _, route := range r { 
     var handler http.Handler 

     handler = route.HandlerFunc 
     handler = core.Logger(handler, route.Name) 

     routerInstance. 
      Methods(route.Method). 
      Path(route.Path). 
      Name(route.Name). 
      Handler(handler) 

    } 

    return routerInstance 
} 

je reçois toujours l'erreur suivante (comme on pouvait s'y attendre)

ne peut pas utiliser route.HandlerFunc (chaîne de type) comme le type http.Handler dans l'attribution : chaîne ne met pas en oeuvre http.Handler (méthode ServeHTTP manquante)

On m'a dit d'utiliser quelque chose comme:

var functions = map[string]interface{}{ 
    "HandleFunc1": HandleFunc1, 
} 

Mais je ne sais pas comment faire ce travail

Répondre

1

Merci à RayenWindspear j'ai pu résoudre le problème. C'était très simple (comme tout). Le code de carte devrait ressembler à ceci:

var functions = map[string]http.HandlerFunc{ 
    "HandleFunc1": HandleFunc1, 
} 
1

J'utilise un MUX pour les sous-domaines, donc mes exemples peuvent être un peu au large. La carte vous dit d'utiliser est fait quelque chose comme ceci:

type Handlers map[string]http.HandlerFunc 

func (handlers Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    path := r.URL.Path 
    if handle := handlers[path]; handle != nil { 
     handle.ServeHTTP(w, r) 
    } else { 
     http.Error(w, "Not found", 404) 
    } 
} 
+0

Vous m'avez au-dessus de la ligne merci. Je dois changer ma carte pour: var fonctions = carte [chaîne] http.HandlerFunc –

+0

Je pensais que quelque chose serait éteint. Comme je l'ai dit, le mien était spécifique aux sous-domaines, d'où la carte des gestionnaires. En fait, j'ai modifié la première ligne de la fonction depuis la recherche du sous-domaine jusqu'à l'obtention du chemin, donc mon code ici ne fonctionne probablement pas tel quel: O. Je vais l'éditer pour utiliser handleFuncs – RayfenWindspear