2014-08-30 54 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

相关问题