Создать 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!`)
}