web-dev-qa-db-ja.com

golangでサンプル本文文字列を使用してhttp.Responseインスタンスを作成します

サンプルを作成しますhttp.Responseサンプルボディ文字列を持つgolangのインスタンス。

問題は、そのbodyプロパティがReadCloserインスタンスを受け入れることです。しかし、そのダミーの応答インスタンスとして、ストリームの読み取り/クローズ部分をすべて設定せずに簡単に設定するためのトリックがあるのではないかと思っていました。

17
Rana

Not_a_Golfer および JimB が示唆するとおり:

io.ReadCloserは、structRead関数とClose関数の両方を実装するときに満たされるインターフェイスです。

幸いなことに、ioutil.NopCloser、これはio.ReadernopCloser構造体でラップし、ReadCloseの両方を実装します。ただし、その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 をクリックします。

30
boaz_shuster

一番上の答えに加えて、クライアントが応答を本物の記事として扱うためには、より完全に形成する必要があることがわかりました。通常の(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ステータスコードを使用して、承認を要求します)。 reqhttp.Request応答を生成する対象。

9
David G

これは動作するはずです。

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!`)
}
1
Ga Sacchi