Je souhaite créer un échantillon http.Response
instance dans golang avec un exemple de chaîne de corps.
Le problème est que sa propriété body accepte l'instance ReadCloser
. Mais comme c'est une instance de réponse factice, je me demandais s'il y avait une astuce pour le configurer facilement sans configurer toutes les parties de lecture/fermeture de ce flux.
Comme suggéré par Not_a_Golfer et JimB :
io.ReadCloser
est une interface qui est satisfaite lorsqu'un struct
implémente à la fois les fonctions Read
et Close
.
Heureusement, il y a ioutil.NopCloser
, qui prend un io.Reader
et l'enveloppe dans la structure nopCloser
, qui implémente à la fois Read
et Close
. Cependant, sa fonction Close
fait rien comme l'indique le nom.
Voici un exemple:
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)
}
Pour jouer avec le code, cliquez sur ici .
Suite à la première réponse, j'ai constaté que pour que la réponse soit traitée comme un véritable article par les clients, elle doit être plus complète. Pour une réponse normale (200), je fais ce qui suit:
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),
}
Ensuite, vous pouvez, par exemple, ajouter des en-têtes (avec un code d'état 401, pour demander une autorisation, par exemple). req
est le http.Request
pour lequel vous générez la réponse.
Cela devrait fonctionner ..
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!`)
}