// configure registers the API's routes on a router. If the passed router is nil, we create a new one and return it. // The nil mode is used when an API is run in stand-alone mode. func (a *API) configure(router *httprouter.Router) *httprouter.Router { if router == nil { router = httprouter.New() } for i, route := range a.Routes { if err := route.parseInfo(route.Path); err != nil { logging.Error("Error parsing info for %s: %s", route.Path, err) } a.Routes[i] = route h := a.handler(route) pth := a.FullPath(route.Path) if route.Methods&GET == GET { logging.Info("Registering GET handler %v to path %s", h, pth) router.Handle("GET", pth, h) } if route.Methods&POST == POST { logging.Info("Registering POST handler %v to path %s", h, pth) router.Handle("POST", pth, h) } } chain := buildChain(a.SwaggerMiddleware...) if chain == nil { chain = buildChain(a.swaggerHandler()) } else { chain.append(a.swaggerHandler()) } // Server the API documentation swagger router.GET(a.FullPath("/swagger"), a.middlewareHandler(chain, nil, nil)) chain = buildChain(a.TestMiddleware...) if chain == nil { chain = buildChain(a.testHandler()) } else { chain.append(a.testHandler()) } router.GET(path.Join("/test", a.root(), ":category"), a.middlewareHandler(chain, nil, nil)) // Redirect /$api/$version/console => /console?url=/$api/$version/swagger uiPath := fmt.Sprintf("/console?url=%s", url.QueryEscape(a.FullPath("/swagger"))) router.Handler("GET", a.FullPath("/console"), http.RedirectHandler(uiPath, 301)) return router }
func addHandlers(router *httprouter.Router, midl *idl.Idl) error { count := 0 re := regexp.MustCompile(`\{(\w+)\}`) for _, svc := range allServices(midl) { for _, mth := range svc.Methods { count++ op, err := rest.ReadOp(mth) if err != nil { log.Fatal("Cannot process %s.%s: %s", svc.Name, mth.Name, err) } if !op.Hide { routePath := re.ReplaceAllString(path.Join(conf.RestPath, op.Path), ":$1") handle, err := makeHandler(midl, svc, mth) if err != nil { return err } router.Handle(op.Method.String(), routePath, handle) log.Printf("%s %s -> %s", op.Method.String(), path.Join(conf.RestPath, op.Path), path.Join(conf.BabelPath, svc.Name, mth.Name)) } babelPath := path.Join(conf.BabelPath, svc.Name, mth.Name) if !strings.HasPrefix(babelPath, "/") { babelPath = "/" + babelPath } handle, err := makeBabelHandler(midl, svc, mth) if err != nil { return err } router.Handle("POST", babelPath, handle) log.Printf("%s %s -> %s", op.Method.String(), babelPath, babelPath) } } if count == 0 { log.Fatal("No services to process") } return nil }
// Registers an array of route handlers to gorilla/mux func RegisterRoutes(rtr *httprouter.Router, controller WebController) { for _, route := range controller.GetRoutes() { rtr.Handle(route.GetMethod(), route.GetPath(), route.GetHandler()) } }