我愿意用golang创建一个示例http.Response示例,并使用一个示例主体字符串。问题是,它的body属性接受ReadCloser示例。但由于它是一个虚拟的响应示例,我想知道是否有一些技巧可以轻松设置它,而无需设置所有的流读取/关闭部分。
http.Response
ReadCloser
qlfbtfca1#
正如Not_a_Golfer和JimB所建议的:io.ReadCloser是当struct实现Read和Close功能时满足的接口。幸运的是,有一个io.NopCloser,它接受一个io.Reader并将其 Package 在nopCloser结构中,该结构实现了Read和Close。但是,它的Close函数并不像名称所暗示的那样做任何事情。下面是一个例子:
io.ReadCloser
struct
Read
Close
io.NopCloser
io.Reader
nopCloser
package main import ( "bytes" "fmt" "io" "net/http" ) func main() { t := http.Response{ Body: io.NopCloser(bytes.NewBufferString("Hello World")), } buff := bytes.NewBuffer(nil) t.Write(buff) fmt.Println(buff) }
字符串要使用代码,请单击here。
nom7f22z2#
除了最重要的答案,我发现,为了让客户将回复视为真正的文章,它需要更完整地形成。对于正常的(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。
req
http.Request
0x6upsns3#
这应该可以。
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!`) }
字符串
dphi5xsq4#
是的,ioutil.NopCloser正是我所需要的!我试图测试一个方法,该方法为社交连接端点执行对facebook API的调用(通过helper函数),我想模拟来自helper函数的facebook响应,所以我的解决方案如下所示:预期的facebook响应(转换为我自己的UserData结构)是:
ioutil.NopCloser
UserData
UserData { ID: facebookID, Email: email, FirstName: firstName, LastName: lastName, }
字符串所以我创建了如下预期响应:
fbUserData, _ := json.Marshal(UserData{ ID: facebookID, Email: email, FirstName: firstName, LastName: lastName, }) fbUserDataResponse := &http.Response{ Body: ioutil.NopCloser(bytes.NewBufferString(string(fbUserData))), }
型然后我可以模拟调用facebook API的方法的响应,如下所示:
s.fbGateway.EXPECT().ExecuteGetQuery(userUrl).Return(fbUserDataResponse, nil).Times(1)
型这里的要点是,这实际上是在模拟任何类型的返回*http.Response数据的函数(在我的例子中,我通过一个返回http Response的辅助函数调用facebook API,如上所述)。
*http.Response
4条答案
按热度按时间qlfbtfca1#
正如Not_a_Golfer和JimB所建议的:
io.ReadCloser
是当struct
实现Read
和Close
功能时满足的接口。幸运的是,有一个
io.NopCloser
,它接受一个io.Reader
并将其 Package 在nopCloser
结构中,该结构实现了Read
和Close
。但是,它的Close
函数并不像名称所暗示的那样做任何事情。下面是一个例子:
字符串
要使用代码,请单击here。
nom7f22z2#
除了最重要的答案,我发现,为了让客户将回复视为真正的文章,它需要更完整地形成。对于正常的(200)响应,我执行以下操作:
字符串
然后,您可以,例如,添加头(与401状态代码,要求授权,说)。
req
是要为其生成响应的http.Request
。0x6upsns3#
这应该可以。
字符串
dphi5xsq4#
是的,
ioutil.NopCloser
正是我所需要的!我试图测试一个方法,该方法为社交连接端点执行对facebook API的调用(通过helper函数),我想模拟来自helper函数的facebook响应,所以我的解决方案如下所示:
预期的facebook响应(转换为我自己的
UserData
结构)是:字符串
所以我创建了如下预期响应:
型
然后我可以模拟调用facebook API的方法的响应,如下所示:
型
这里的要点是,这实际上是在模拟任何类型的返回
*http.Response
数据的函数(在我的例子中,我通过一个返回http Response的辅助函数调用facebook API,如上所述)。