3 回答

TA貢獻1852條經驗 獲得超7個贊
正如Not_a_Golfer和JimB所建議的:
io.ReadCloser是一個接口,當 astruct實現Read和Close函數時滿足。
幸運的是,有ioutil.NopCloser,它接受 aio.Reader并將其包裝在nopCloser結構中,該結構同時實現Read和Close。然而,它的Close功能并沒有從名字中暗示出來。
下面是一個例子:
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)
}

TA貢獻1890條經驗 獲得超9個贊
除了最上面的答案,我發現為了讓客戶將響應視為真品,它需要更完整地形成。對于正常 (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您為其生成響應的 。

TA貢獻1829條經驗 獲得超7個贊
這應該工作..
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!`)
}
- 3 回答
- 0 關注
- 348 瀏覽
添加回答
舉報