用golang中的示例体字符串创建http.Response示例

e0bqpujr  于 2023-08-01  发布在  Go
关注(0)|答案(4)|浏览(188)

我愿意用golang创建一个示例http.Response示例,并使用一个示例主体字符串。
问题是,它的body属性接受ReadCloser示例。但由于它是一个虚拟的响应示例,我想知道是否有一些技巧可以轻松设置它,而无需设置所有的流读取/关闭部分。

qlfbtfca

qlfbtfca1#

正如Not_a_GolferJimB所建议的:
io.ReadCloser是当struct实现ReadClose功能时满足的接口。
幸运的是,有一个io.NopCloser,它接受一个io.Reader并将其 Package 在nopCloser结构中,该结构实现了ReadClose。但是,它的Close函数并不像名称所暗示的那样做任何事情。
下面是一个例子:

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

nom7f22z

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

0x6upsns

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!`)
}

字符串

dphi5xsq

dphi5xsq4#

是的,ioutil.NopCloser正是我所需要的!
我试图测试一个方法,该方法为社交连接端点执行对facebook API的调用(通过helper函数),我想模拟来自helper函数的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 Response的辅助函数调用facebook API,如上所述)。

相关问题