Как написать простой пользовательский HTTP-сервер в Go?

Я новичок в Go и пытаюсь написать собственный http-сервер. Получив ошибку компиляции. Как я могу реализовать метод ServeHTTP в своем коде?

Мой код:

package main

import (
        "net/http"
        "fmt"
        "io"
        "time"
    )


func myHandler(w http.ResponseWriter, req *http.Request){
    io.WriteString(w, "hello, world!\n")
}


func main() {

    //Custom http server
    s := &http.Server{
        Addr:           ":8080",
        Handler:        myHandler,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }

    err := s.ListenAndServe()
    if err != nil {
        fmt.Printf("Server failed: ", err.Error())
    }
}

Ошибка при компиляции:

.\hello.go:21: cannot use myHandler (type func(http.ResponseWriter, *http.Request)) as type http.Handler in field value:
    func(http.ResponseWriter, *http.Request) does not implement http.Handler (missing ServeHTTP method)

Ответы

Ответ 1

Вы либо используете структуру, либо определяете ServeHTTP на ней, либо просто переносите свою функцию в HandlerFunc

s := &http.Server{
    Addr:           ":8080",
    Handler:        http.HandlerFunc(myHandler),
    ReadTimeout:    10 * time.Second,
    WriteTimeout:   10 * time.Second,
    MaxHeaderBytes: 1 << 20,
}

Ответ 2

чтобы нормально работать, myHandler должен быть объектом, который удовлетворяет Handler Interface, другими словами myHandler должен иметь метод называется ServeHTTP.

Например, скажем, что myHandler - это пользовательский обработчик для отображения текущего времени. Код должен выглядеть следующим образом:

package main

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

type timeHandler struct {
    zone *time.Location
}

func (th *timeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    tm := time.Now().In(th.zone).Format(time.RFC1123)
    w.Write([]byte("The time is: " + tm))
}

func newTimeHandler(name string) *timeHandler {
    return &timeHandler{zone: time.FixedZone(name, 0)}
}

func main() {

    myHandler := newTimeHandler("EST")
    //Custom http server
    s := &http.Server{
        Addr:           ":8080",
        Handler:        myHandler,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }

    err := s.ListenAndServe()
    if err != nil {
        fmt.Printf("Server failed: ", err.Error())
    }
}

запустите этот код и войдите в http://localhost:8080/ в своем браузере. вы должны увидеть форматированный текст, подобный этому

The time is: Sat, 30 Aug 2014 18:19:46 EST

(вы должны увидеть другое время.)

надеюсь, что эта помощь,

Дальнейшее чтение

Резюме обработки запроса в Google

Ответ 3

Результат: tonycai @frog: ~ $curl " http://localhost:4000" Время: Пт, 12 Янв 2018 04:11:18 EST

но как изменить часовой пояс? от EST до CST