2014-08-30 4 views
14

मैं जाने के लिए नया हूं और एक कस्टम http सर्वर लिखने की कोशिश कर रहा हूं। संकलन त्रुटि प्राप्त करना। मैं अपने कोड में ServeHTTP विधि को कैसे कार्यान्वित कर सकता हूं?गो में एक साधारण कस्टम 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

आप या तो एक struct का उपयोग करें और उस पर ServeHTTP परिभाषित या बस एक HandlerFunc

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

क्या आप 'ए' के ​​बजाय 'ए' लिखने का मतलब रखते थे या तो आप एक संरचना को परिभाषित करते हैं? – kometen

+0

@ kometen yep! वाह 3 साल पुराना टाइपो, फिक्सिंग। – OneOfOne

+0

मैं एकाधिक हैंडलर फ़ंक्शन कैसे जोड़ सकता हूं? – AMB

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

रन इस कोड और अपने ब्राउज़र में http://localhost:8080/ की तरह होना चाहिए। यदि आप इस

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

(। आप अलग अलग समय देखना चाहिए) इस मदद

आशा की तरह स्वरूपित पाठ दिखाई देना चाहिए

इसके अलावा अधिक पढ़ने

A Recap of Request Handling in Go

+0

धन्यवाद। आपका जवाब सही है। लेकिन http.HandlerFunc (myHandler) स्वचालित रूप से हैंडलर इंटरफ़ेस को संतुष्ट करके MyHandler में ServeHTTP विधि जोड़कर इसे सरल बनाता है। – AnkurS

+0

@AkkurS ठीक है, मुझे भी OneOfOne उत्तर पसंद है। यह अधिक आसान है :) – pyk

-2

परिणाम: टोनीकाई @ मेंढक: ~ $ कर्ल "http://localhost:4000" समय है: शुक्र, 12 जनवरी 2018 04:11:18 ईएसटी

लेकिन, टाइमज़ोन को कैसे बदला जाए? ईएसटी से सीएसटी

+0

हाय, एसओ पर आपके पहले उत्तर के लिए धन्यवाद। लेकिन यह सवाल का जवाब नहीं है। यदि आपके पास कोई अन्य प्रश्न है, तो कृपया इसके बजाय एक नया प्रश्न पोस्ट करें। – zwcloud

संबंधित मुद्दे