2014-08-30 44 views
14

我是新手,試圖編寫自定義http server.Getting編譯錯誤。我如何在我的代碼中實現ServeHTTP方法?如何在Go中編寫簡單的自定義http服務器?

我的代碼:

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) 

回答

15

你要麼使用結構,並在其上定義ServeHTTP或者乾脆換你的函數在HandlerFunc

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

您是否在'您使用結構體和定義'中寫'and'而不是'an'? – kometen 2017-08-28 14:07:45

+0

@kometen yep! 3歲的錯字,修復。 – OneOfOne 2017-08-28 20:37:26

+0

我如何添加多個處理函數? – AMB 2017-12-12 05:46:26

6

爲了正常工作,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()) 
    } 
} 

運行此代碼並在您的瀏覽器中訪問​​。你應該看到類似這樣的

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

(你應該看到不同的時間。)

希望這有助於格式化文本,

進一步閱讀

A Recap of Request Handling in Go

+0

謝謝。你的回答是正確的。但是http.HandlerFunc(myHandler)通過在myHandler中自動添加ServeHTTP方法來簡化它,從而滿足Handler接口。 – AnkurS 2014-08-30 20:07:35

+0

@AnkurS好吧,我也喜歡OneOfOne的答案。這更簡單:) – pyk 2014-08-30 20:42:11

-2

結果: tonycai @ frog:〜$ curl「http://localhost:4000」 現在時間是:2018年1月12日星期五04:11:18 EST

但是,如何更改時區?從EST到CST

+0

嗨,感謝您的第一個答案。但這不是對這個問題的回答。如果您有其他問題,請改爲發佈新問題。 – zwcloud 2018-01-12 04:27:09

相關問題