2015-11-29 14 views
8

Jestem gotów utworzyć przykładową instancję http.Response w golangu z przykładowym łańcuchem treści.Utwórz instancję http.Response z ciągiem znaków w golang

Problem polega na tym, że właściwość jego ciała akceptuje instancję ReadCloser. Ale jako fałszywa instancja odpowiedzi, zastanawiałem się, czy jest jakaś sztuczka, aby ją łatwo ustawić bez konfigurowania wszystkich tych strumieni do odczytu/zamknięcia części.

+3

Możesz rozszerzyć prosty czytnik smyczków lub coś podobnego za pomocą fikcyjnej metody 'Zamknij'. –

+6

Co jest dla ciebie zrobione: [ioutiil.NopCloser] (https://golang.org/pkg/io/ioutil/#NopCloser) – JimB

Odpowiedz

16

Jak sugeruje Not_a_Golfer i JimB:

io.ReadCloser jest interfejs, który jest zadowolony, gdy struct jednocześnie do Read narzędzia i funkcje Close.

szczęście jest ioutil.NopCloser, który zajmuje io.Reader i zawija je w nopCloser struktury, która implementuje zarówno Read i Close. Jednak jego funkcja Close ma wartość nothing, jak wynika z nazwy.

Oto przykład:

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

grać z kodu, kliknij here.

1

To powinno działać ..

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

Więcej na górę odpowiedź, znalazłem, że w celu odpowiedzi należy traktować jako autentycznego artykułu przez klientów, musi być w pełni uformowane. Dla normalnego (200) odpowiedzi, I wykonaj następujące czynności:

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

Wtedy można na przykład dodać nagłówki (z kodem 401 statusu, aby poprosić o zezwolenie, powiedzmy). req to http.Request, dla którego generujesz odpowiedź.

Powiązane problemy