2014-08-30 19 views
14

Tôi mới dùng Go và cố gắng viết một máy chủ http tùy chỉnh.Đặt lỗi biên dịch. Làm thế nào tôi có thể thực hiện các phương pháp ServeHTTP trong mã của tôi?Làm thế nào để viết một máy chủ http tùy chỉnh đơn giản trong Go?

Mã của tôi:

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()) 
    } 
} 

Lỗi khi biên dịch:

.\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) 

Trả lời

15

Bạn có thể sử dụng một cấu trúc và xác định ServeHTTP trên đó hoặc đơn giản là quấn chức năng của bạn trong một HandlerFunc

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

Ý của bạn là viết 'và' thay vì 'an' trong 'Bạn có sử dụng cấu trúc định nghĩa' không? – kometen

+0

@kometen yep! wow 3 năm lỗi đánh máy cũ, sửa chữa. – OneOfOne

+0

Tôi có thể thêm nhiều chức năng xử lý bằng cách nào? – AMB

6

để hoạt động bình thường, myHandler phải là đối tượng đáp ứng Handler Interface, nói cách khác là myHandler nên có phương pháp được gọi là ServeHTTP.

Ví dụ: giả sử myHandler là trình xử lý tùy chỉnh để hiển thị thời gian hiện tại. Mã phải giống như thế này

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()) 
    } 
} 

chạy mã này và truy cập http://localhost:8080/ trong trình duyệt của bạn. bạn sẽ thấy văn bản được định dạng như thế này

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

(bạn sẽ thấy thời gian khác nhau.)

hy vọng sự giúp đỡ này,

Tiếp tục đọc hơn

A Recap of Request Handling in Go

+0

Cảm ơn. Câu trả lời của bạn là đúng. Nhưng http.HandlerFunc (myHandler) đơn giản hóa nó bằng cách tự động thêm phương thức ServeHTTP vào myHandler, qua đó thỏa mãn giao diện Handler. – AnkurS

+0

@AnkurS ok, tôi cũng thích câu trả lời của OneOfOne. Nó đơn giản hơn :) – pyk

-2

kết quả: tonycai @ frog: ~ $ curl "http://localhost:4000" Thời gian là: Fri, 12 Jan 2018 04:11:18 EST

nhưng, làm thế nào để thay đổi múi giờ? từ EST đến CST

+0

Xin chào, cảm ơn câu trả lời đầu tiên của bạn về SO. Nhưng đây không phải là câu trả lời cho câu hỏi. Nếu bạn có câu hỏi khác, vui lòng đăng câu hỏi mới thay thế. – zwcloud

Các vấn đề liên quan