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