我愿意在golang中使用示例正文字符串创建示例http.Response
实例。
问题是,它的body属性接受ReadCloser
实例。但作为一个虚拟响应实例,我想知道是否有一些技巧可以轻松设置它而无需设置所有流读取/关闭部分。
答案 0 :(得分:25)
根据Not_a_Golfer和JimB的建议:
else {
var spelledWord = spellCheck(word);
if(spelledWord)
do something with spelledWord
}
是io.ReadCloser
实现struct
和Read
函数时满足的接口。
幸运的是,Close
有一个ioutil.NopCloser
并将其包含在io.Reader
结构中,该结构实现了nopCloser
和Read
。但是,Close
函数的名称隐含nothing。
以下是一个例子:
Close
要播放代码,请点击here。
答案 1 :(得分:8)
除了最佳答案之外,我发现为了使答案被客户视为真正的文章,需要更充分地形成。对于正常(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
。
答案 2 :(得分:1)
这应该有用..
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 :(得分:1)
是的,ioutil.NopCloser
正是我所需要的!
我正在尝试测试对社交连接终结点执行Facebook API(通过助手功能)调用的方法,我想模拟来自助手功能的Facebook响应,因此我的解决方案如下:
预期的Facebook响应(转换为我自己的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响应的辅助函数来调用facebook API)。