我是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)
为了正常工作,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)
(你应该看到不同的时间.)
希望这个帮助,
更多阅读
您还可以定义一个多路复用器并向其添加处理程序,然后再将其分配给服务器,如下所示。
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)
| 归档时间: |
|
| 查看次数: |
8709 次 |
| 最近记录: |