2017-03-29 2 views
1

Ich habe versucht, eine JSON-Konfigurationsdatei einzurichten, um dynamische Routen für meine Anwendung einzurichten. Die Idee ist, dass ich in der Lage sein werde, meine eigene URL-Struktur einzurichten, abhängig davon, wer den Service benutzt. Ich habe eine Struktur, die JSON aufnimmt und das funktioniert gut. Ich benutze Gorilla Mux.Golang JSON-Konfiguration für Routen

Die JSON ist im Grunde identisch mit der Struktur und es geht in Ordnung.

Das Problem, das ich habe, ist die HandleFunc Abschnitt. Hier

ist der 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 
} 

ich immer die folgende Fehlermeldung erhalten (wie man erwarten würde)

nicht verwenden können route.HandlerFunc (Typ string) als Typ http.Handler in Zuordnung : Zeichenfolge nicht implementiert http.Handler (fehlende ServeHTTP Methode)

mir gesagt wurde, wie etwas zu verwenden:

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

Aber ich habe keine Ahnung, wie diese Arbeit machen

Antwort

1

Dank RayenWindspear konnte ich das Problem beheben. Es war sehr einfach (wie alles). Der Kartencode sollte so aussehen:

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

Ich bin ein Mux für Sub-Domains verwenden, so meine Beispiele ein wenig weg sein kann. Die Karte, die Sie gesagt wird, zu verwenden, ist so etwas getan:

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

Sie haben mich über die Linie Danke. Ich muss meine Karte zu ändern: var functions = map [string] http.HandlerFunc –

+0

Ich dachte, etwas wäre aus. Wie ich schon sagte, meine war spezifisch für Subdomains, daher die Karte der Handler. Ich habe tatsächlich die erste Zeile in der Funktion geändert, indem ich die Subdomain nachgeschlagen habe, um den Pfad zu bekommen, so dass mein Code hier wahrscheinlich nicht einmal so funktioniert: O. Ich werde es bearbeiten, um handleFuncs zu verwenden – RayfenWindspear