Почему функция обработчика GET не может быть достигнута с помощью новой расширенной маршрутизации в go 1.22?

Я играюсь с новыми функциями go 1.22, но не могу получить доступ к функции обработчика GET "/users/register" и вместо этого получаю 404. В чем здесь проблема? фрагмент из основного пакета:

func main() {
    if err := godotenv.Load(); err != nil {
        log.Fatal("Failed to load .env:", err)
    }

    _, err := repository.InitDB()
    if err != nil {
        log.Fatal("Failed to initialise the database:", err)
    }

    userMux := http.NewServeMux()
    if err := handlers.InitUserRoutes(userMux); err != nil {
        log.Fatal("Failed to initialise user routes:", err)
    }

    mux := http.NewServeMux()
    mux.Handle("/users/", userMux)
    log.Fatal(http.ListenAndServe(fmt.Sprintf("%s:%s", os.Getenv("DOMAIN"), os.Getenv("PORT")), mux))
}

фрагмент из обработчиков пакетов:

var templates *template.Template

func InitUserRoutes(mux *http.ServeMux) error {
    var err error
    templates, err = utils.ParseTemplates("web/templates/user")
    if err != nil {
        return err
    }

    mux.HandleFunc("GET /register/", registerGet)
    mux.HandleFunc("POST /register/", registerPost)

    return nil
}

func registerGet(w http.ResponseWriter, r *http.Request) {
    fmt.Println("I'm here")
    err := templates.ExecuteTemplate(w, "register.html", nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

func registerPost(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Printf("%#v\n\n%#v", r.Form, r.PostForm)
    email, username, password := r.FormValue("email"), r.FormValue("username"), r.FormValue("password")
    fmt.Printf("%v, %v, %v\n", email, username, password)
}

фрагмент из пакета утилит:

func ParseTemplates(folderPath string) (*template.Template, error) {
    return template.ParseGlob(filepath.Join(folderPath, "*.html"))
}

@BurakSerdar уже пробовал, не работает.

Recovery Email 15.04.2024 18:50

Вам нужно обработать GET /users/register/ или использовать http.StripPrefix в main.

Peter 15.04.2024 18:54

@Peter Кажется, чтобы первая идея сработала, мне пришлось бы вместо этого использовать mainMux, а не инициализировать userMux. Итак, остается вторая идея, и так оно и должно быть, потому что, если вы не удалите префикс, шаблон будет выглядеть следующим образом: «/users/GET /register/». Итак, строка должна выглядеть так: mux.Handle("/users/", http.StripPrefix("/users", userMux)) Правильно ли я это понимаю? Обновлено: также завершающая косая черта кажется обязательной, потому что без нее вы по какой-то причине перенаправляетесь на «/register/» из «/users/register». Чего я не совсем понимаю.

Recovery Email 15.04.2024 19:36
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Он отлично работает для меня

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    prefix := "/users"
    userMux := http.NewServeMux()
    userMux.HandleFunc("GET /register/", registerGet)
    userMux.HandleFunc("GET /register2/", registerGet)
    userMux.HandleFunc("POST /register/", registerPost)

    mux := http.NewServeMux()
    mux.Handle("/users/{pathname...}", http.StripPrefix(prefix, userMux))
    log.Fatal(http.ListenAndServe(":12345", mux))
}

func registerGet(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, r.Method, "I'm here", r.RequestURI)
}

func registerPost(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, r.Method, "I'm here", r.RequestURI)
}

Другие вопросы по теме