サンプルを作成しますhttp.Response
サンプルボディ文字列を持つgolangのインスタンス。
問題は、そのbodyプロパティがReadCloser
インスタンスを受け入れることです。しかし、そのダミーの応答インスタンスとして、ストリームの読み取り/クローズ部分をすべて設定せずに簡単に設定するためのトリックがあるのではないかと思っていました。
Not_a_Golfer および JimB が示唆するとおり:
io.ReadCloser
は、struct
がRead
関数とClose
関数の両方を実装するときに満たされるインターフェイスです。
幸いなことに、ioutil.NopCloser
、これはio.Reader
をnopCloser
構造体でラップし、Read
とClose
の両方を実装します。ただし、その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 をクリックします。
一番上の答えに加えて、クライアントが応答を本物の記事として扱うためには、より完全に形成する必要があることがわかりました。通常の(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
応答を生成する対象。
これは動作するはずです。
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!`)
}