2015-11-29 8 views
8

サンプルボディストリングを使用してゴールグ内にサンプルhttp.Responseインスタンスを作成します。ゴランのサンプルボディストリングを使用してhttp.Responseインスタンスを作成します。

問題は、本体のプロパティがReadCloserインスタンスを受け入れることです。しかし、ダミーのレスポンスのインスタンスとして、ストリームの読み込み/終了の部分をすべて設定せずに簡単に設定できるトリックがあるかどうかは疑問でした。

+3

単純な文字列リーダなどをダミーの 'Close'メソッドで拡張することができます。 –

+6

これはあなたのために行われます:[ioutiil.NopCloser](https://golang.org/pkg/io/ioutil/#NopCloser) – JimB

答えて

16

Not_a_GolferJimBによって示唆されるように:

io.ReadCloserstructReadClose機能の両方を実装する際に満たされているインターフェースです。

幸い、io.Readerを取り、ReadCloseの両方を実装nopCloser構造体、それをラップしioutil.NopCloserは、そこにあります。ただし、そのClose関数はnothingという名前から暗示されています。

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

コードを再生するには、hereをクリックしてください:ここで

は一例です。

1

これはトップの答えにさらに..

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

を動作するはずです、私はクライアントが本物として扱われることに応答ためには、それがより完全に形成する必要があることを発見しました。ノーマル(200)応答のために、私は次のようにします。

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

を次にあなたは、例えば、ヘッダを追加することができます(承認を求めるために、401のステータスコードで、と言います)。 reqは、応答を生成するhttp.Requestです。

関連する問題