Создать http.Экземпляр ответа с образцом body string в golang
Я готов создать образец http.Response экземпляр в golang с образцом строки тела.
проблема в том, что его свойство body принимает ReadCloser экземпляра. Но как его фиктивный экземпляр ответа, мне было интересно, есть ли какой-то трюк, чтобы установить его легко, не настраивая все эти части чтения/закрытия потока.
3 ответов
как было предложено Not_a_Golfer и JimB:
io.ReadCloser - это интерфейс, который достигается, когда struct реализует как Read и Close функции.
к счастью, есть ioutil.NopCloser, которую занимает io.Reader и заворачивает его в nopCloser struct, который реализует оба Read и Close. Однако его
далее к верхнему ответу, я обнаружил, что для того, чтобы ответ рассматривался как подлинная статья клиентами, он должен быть более полно сформирован. Для нормального (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!`)
}