2015-11-29 7 views
8

Ich bin bereit, eine Beispiel http.Response Instanz in Golang mit einer Beispielkörperfolge zu erstellen.Erstellen http.Response-Instanz mit Beispielkörper Zeichenfolge in Golang

Problem ist, seine Körpereigenschaft akzeptiert ReadCloser Instanz. Aber als eine Dummy-Response-Instanz habe ich mich gefragt, ob es einen Trick gibt, um es einfach einzurichten, ohne all diese Stream-Read/Close-Teile einzurichten.

+3

Sie können einen einfachen String Reader oder etwas ähnliches mit einer Dummy 'Close' Methode erweitern. –

+6

Was für Sie getan wird: [ioutiil.NopCloser] (https://golang.org/pkg/io/ioutil/#NopCloser) – JimB

Antwort

16

Wie Not_a_Golfer vorgeschlagen und JimB:

io.ReadCloser ist eine Schnittstelle, die erfüllt ist, wenn ein struct implementiert sowohl die Read und die Close Funktionen.

Glücklicherweise gibt es ioutil.NopCloser, die eine io.Reader nimmt und wickelt es in der nopCloser Struktur, die sowohl Read und Close implementiert. Die Close-Funktion tut jedoch nothing, wie aus dem Namen hervorgeht. Hier

ein Beispiel:

package main 

import (
    "bytes" 
    "fmt" 
    "io/ioutil" 
    "net/http" 
) 

func main() { 
    t := http.Response{ 
     Body: ioutil.NopCloser(bytes.NewBufferString("Hello World")), 
    } 

    buff := bytes.NewBuffer(nil) 
    t.Write(buff) 

    fmt.Println(buff) 
} 

Um mit dem Code zu spielen, klicken Sie here.

1

Diese Arbeit sollte ..

func main(){ 

    go serveHTTP(*port, *host) 

    select {} 
} 

func serveHTTP(port int, host string) { 

    mux := http.NewServeMux() 
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
     requestHandler(w, r) 
    }) 

    addr := fmt.Sprintf("%v:%d", host, port) 
    server := &http.Server { 
     Addr:   addr, 
     Handler:  mux, 
     ReadTimeout: 10 * time.Second, 
     WriteTimeout: 10 * time.Second, 
     MaxHeaderBytes: 1 << 20, 
    } 

    err := server.ListenAndServe() 
    log.Println(err.Error()) 
} 

func requestHandler(w http.ResponseWriter, r *http.Request){ 
    fmt.Fprintf(w, `Success!`) 
} 
4

Im Anschluss an die Top-Antwort, die ich gefunden habe, dass für die Reaktion, um als echte Artikel von Kunden behandelt werden, ist es voll ausgebildet werden muss. Für eine normale (200) Antwort, ich folgenden tun:

body := "Hello world" 
t := &http.Response{ 
    Status:  "200 OK", 
    StatusCode: 200, 
    Proto:   "HTTP/1.1", 
    ProtoMajor: 1, 
    ProtoMinor: 1, 
    Body:   ioutil.NopCloser(bytes.NewBufferString(body)), 
    ContentLength: int64(len(body)), 
    Request:  req, 
    Header:  make(http.Header, 0), 
} 

Dann können Sie zum Beispiel, fügen Sie Header (mit Statuscode 401, für die Zulassung zu fragen, sagen). req ist die http.Request, für die Sie die Antwort generieren.