Как написать простой пользовательский 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