Go: обслуживать статические страницы (их конечные точки) вместе с конечными точками моего API.

Итак, у меня возникла проблема, когда я могу работать только с моими конечными точками API или моими статическими файлами. Я использую gorilla/mux в качестве маршрутизатора, и, возможно, это как-то связано с его настройкой.

У меня есть четыре файла, которые, как мне кажется, имеют значение в этой ситуации:

main.go

func main() {
    envVars()

    router := NewRouter()

    log.Fatal(http.ListenAndServe(":8080", router))

}

router.go

func NewRouter() *mux.Router {
    // create new router
    router := mux.NewRouter()

    for _, route := range routes {
        var handler http.Handler

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

        router.
            Methods(route.Method).
            Path(route.Pattern).
            Name(route.Name).
            Handler(route.HandlerFunc)
    }

    return router

}

routes.go

var routes = Routes{

    Route{
       // TODO: Find way to render static file
       "Index",
        "GET",
        "/",
        Index,
    },
    Route{
        "PostIndex",
        "GET",
        "/api/posts",
        PostIndex,
    },
    Route{
        "PostCreate",
        "POST",
        "/api/posts",
        PostCreate,
    },
}

handlers.go

func Index(w http.ResponseWriter, r *http.Request) {
    // TODO: Something to render html file
}

Из исследований я подумал, что мог бы использовать подмаршрутизатор, но, похоже, должен быть лучший способ сделать это. Для всех других моих маршрутов я реализовал методы, но для рендеринга html-файла я не уверен, что будет помещено в этот метод.

Чтобы просмотреть весь проект, посетите: https://github.com/nicholasrucci/blog

Обновлять

Я нашел этот источник. Это похоже на то, через что я прохожу.


person Nick Rucci    schedule 12.04.2016    source источник
comment
Если вы не используете шаблоны, просто прочитайте файл и напишите его в генератор ответов в обработчике, если вы используете шаблоны, просто поместите туда статический html-файл, и он будет обработан как есть, поскольку в нем не будет заполнителей/ код в нем подлежит замене.   -  person evanmcdonnal    schedule 13.04.2016


Ответы (2)


Обновлен код для исправления ошибки. Привязка файлового сервера только к корневому пути, оставляя другие маршруты свободными для использования другими обработчиками.

Удалите маршрут Index в routes.go и обновите router.go следующим образом:

func NewRouter() *mux.Router {
    // create new router
    router := mux.NewRouter()

    for _, route := range routes {
        var handler http.Handler

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

        router.
            Methods(route.Method).
            Path(route.Pattern).
            Name(route.Name).
            Handler(route.HandlerFunc)
    }

    router.Path("/").Handler(http.FileServer(http.Dir("public/")))

    return router

}

Это открывает доступ к файлу index.html в общедоступном каталоге в корневом каталоге вашего домена.

person Niemi    schedule 13.04.2016
comment
Да, я думал, что это поможет. Когда я это делаю, я не получаю 404 not found, но я также не получаю ожидаемый файл с надписью "Hello World" - person Nick Rucci; 13.04.2016
comment
Виноват. Я обновил ответ, и на этот раз я клонировал ваше репо и проверил, работает ли оно :) - person Niemi; 13.04.2016
comment
Это позволяет делать именно то, что вы указали, но лишает возможности возвращать JSON при попадании /api/posts. - person Nick Rucci; 13.04.2016
comment
штопать. Я снова обновил решение. Не тестировал ваши обработчики, требующие подключения к базе данных, но, надеюсь, это должно работать лучше. :) - person Niemi; 13.04.2016
comment
Вы действительно были на правильном пути. Порядок пути имеет значение. Это должно было быть ниже моих маршрутов API. - person Nick Rucci; 13.04.2016

В итоге я создал функцию шаблона и отрисовал оттуда свой HTML.

func Index(w http.ResponseWriter, r *http.Request) {
    t := template.New("Test")
    t, err = t.Parse("<html><body>Hello World</body></html>)
    if err != nil {
        log.Fatal(err)
    }

    err = t.Execute(w, t)
    if err != nil {
        log.Fatal(err)
    }
}
person Nick Rucci    schedule 13.04.2016