如何在Go中编写简单的自定义HTTP服务器?

Ank*_*urS 19 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())
    }
}
Run Code Online (Sandbox Code Playgroud)

编译时出错:

.\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)
Run Code Online (Sandbox Code Playgroud)

One*_*One 21

您要么使用结构并ServeHTTP在其上定义,要么只是将您的函数包装在一个HandlerFunc

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


pyk*_*pyk 6

为了正常工作,myHandler应该是一个满足Handler接口的对象,换句话说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())
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此代码并http://localhost:8080/在浏览器中访问.你应该看到像这样的格式化文本

The time is: Sat, 30 Aug 2014 18:19:46 EST
Run Code Online (Sandbox Code Playgroud)

(你应该看到不同的时间.)

希望这个帮助,

更多阅读

Go中的请求处理概述


Olu*_*ith 5

您还可以定义一个多路复用器并向其添加处理程序,然后再将其分配给服务器,如下所示。

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

func main(){

   // define a serveMux to handle routes
   mux := http.NewServeMux()
   // assign a route/todo to a handler myHandler
   mux.HandleFunc("/todo", myHandler)

   // assign a route/todo/notes to an anonymous func
   mux.HandleFunc("/todo/notes", func(w http.ResponseWriter, req *http.Request) {
       w.Write([]byte("Hello again."))
   })

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

   if err := s.ListenAndServe(); err != nil {
      log.Fatalf("server failed to start with error %v", err.Error())
   }
}
Run Code Online (Sandbox Code Playgroud)