我对歌郎比较陌生,也不完全了解溪流。我有一个功能(断路器功能),是进行休息呼叫。我让它工作,但它只是流的"responseBody“回来。实际上,我想将流的整个请求流回身体和头一起返回。
当我试图在“头”上使用类似的方法时,我会得到一个错误,即标题是不可流的。
有什么好的/最好的方法来完成这个任务吗?谢谢。以下是我的职责。
func CallWithRetries(req *http.Request, output chan []byte) error {
r := retrier.New(retrier.ConstantBackoff(RETRIES, 100 * time.Millisecond), nil)
attempt := 0
err := r.Run(func() error {
attempt++
resp, err := Client.Do(req)
if err == nil && resp.StatusCode < 299 {
responseBody, err := ioutil.ReadAll(resp.Body)
if err == nil {
output <- responseBody
return err
}
return err
} else if err == nil {
customLogger.LogDebug("Status code was: " , transactionId)
err = fmt.Errorf("Status was %v", resp.StatusCode)
}
return err
})
return err
}发布于 2018-08-27 17:17:32
您正在寻找httputil.DumpResponse函数。
代码可能会更改为类似于
func CallWithRetries(req *http.Request, output chan []byte) error {
r := retrier.New(retrier.ConstantBackoff(RETRIES, 100*time.Millisecond), nil)
attempt := 0
err := r.Run(func() error {
attempt++
resp, err := Client.Do(req)
if err == nil && resp.StatusCode < 299 {
dump, err := httputil.DumpResponse(resp, true)
if err == nil {
output <- dump
return err
}
return err
} else if err == nil {
customLogger.LogDebug("Status code was: ", transactionId)
err = fmt.Errorf("Status was %v", resp.StatusCode)
}
return err
})
return err
}旁注,
err变量是隐藏的,这应该被修改以避免任何意外。此版本的代码试图尽早返回错误,并关闭响应体。它没有经过测试,只是在飞行中写的,小心地使用。
func CallWithRetries(req *http.Request, output chan []byte) error {
r := retrier.New(retrier.ConstantBackoff(RETRIES, 100*time.Millisecond), nil)
attempt := 0
return r.Run(func() error {
attempt++
var resp *http.Response
{
r, err := Client.Do(req)
if err != nil {
return err
}
defer r.Body.Close()
if resp.StatusCode > 299 {
customLogger.LogDebug("Status code was: ", transactionId)
return fmt.Errorf("Status was %v", resp.StatusCode)
}
resp = r
}
var out []byte
{
x, err := httputil.DumpResponse(resp, true)
if err != nil {
return err
}
out = x
}
output <- out
return nil
})
}https://stackoverflow.com/questions/52042111
复制相似问题