web-dev-qa-db-fra.com

Créer une instance http.Response avec un exemple de chaîne de corps dans Golang

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.

17
Rana

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 .

30
boaz_shuster

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.

9
David G

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