Подтвердить что ты не робот

Как я могу обрабатывать HTTP-запросы разных методов в/в Go?

Я пытаюсь найти лучший способ обрабатывать запросы / и только / в Go и обрабатывать разные методы разными способами. Здесь лучшее, что я придумал:

package main

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

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path != "/" {
            http.NotFound(w, r)
            return
        }

        if r.Method == "GET" {
            fmt.Fprintf(w, "GET, %q", html.EscapeString(r.URL.Path))
        } else if r.Method == "POST" {
            fmt.Fprintf(w, "POST, %q", html.EscapeString(r.URL.Path))
        } else {
            http.Error(w, "Invalid request method.", 405)
        }
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

Это идиоматический Go? Это лучшее, что я могу сделать со стандартным http lib? Я бы скорее сделал что-то вроде http.HandleGet("/", handler), как в express или Sinatra. Есть ли хорошие рамки для написания простых сервисов REST? web.go выглядит привлекательно, но кажется застойным.

Спасибо за ваш совет.

4b9b3361

Ответ 1

Чтобы вы только обслуживали корень: вы поступаете правильно. В некоторых случаях вам нужно будет вызвать метод ServeHttp объекта http.FileServer вместо вызова NotFound; это зависит от того, есть ли у вас разные файлы, которые вы хотите также использовать.

Чтобы обрабатывать разные методы по-разному: многие из моих обработчиков HTTP не содержат ничего, кроме оператора switch, такого как:

switch r.Method {
case "GET":
    // Serve the resource.
case "POST":
    // Create a new record.
case "PUT":
    // Update an existing record.
case "DELETE":
    // Remove the record.
default:
    // Give an error message.
}

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

Ответ 2

э, я действительно направлялся в постель и, таким образом, быстро комментировал http://www.gorillatoolkit.org/pkg/mux, который действительно хорош и делает то, что вы хотите, просто дайте документы Посмотрите. Например

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    r.HandleFunc("/products", ProductsHandler)
    r.HandleFunc("/articles", ArticlesHandler)
    http.Handle("/", r)
}

и

r.HandleFunc("/products", ProductsHandler).
    Host("www.domain.com").
    Methods("GET").
    Schemes("http")

и многие другие возможности и способы выполнения вышеуказанных операций.

Но я почувствовал необходимость решить другую часть вопроса: "Это лучшее, что я могу сделать". Если std lib немного голый, здесь можно найти отличный ресурс: https://github.com/golang/go/wiki/Projects#web-libraries (специально привязанный к веб-библиотекам).