在golang中使用示例正文字符串创建http.Response实例

时间:2015-11-29 00:57:49

标签: http go response

我愿意在golang中使用示例正文字符串创建示例http.Response实例。

问题是,它的body属性接受ReadCloser实例。但作为一个虚拟响应实例,我想知道是否有一些技巧可以轻松设置它而无需设置所有流读取/关闭部分。

4 个答案:

答案 0 :(得分:25)

根据Not_a_GolferJimB的建议:

else { var spelledWord = spellCheck(word); if(spelledWord) do something with spelledWord } io.ReadCloser实现structRead函数时满足的接口。

幸运的是,Close有一个ioutil.NopCloser并将其包含在io.Reader结构中,该结构实现了nopCloserRead。但是,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)。