首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang海峡流

Golang海峡流
EN

Stack Overflow用户
提问于 2018-08-27 15:02:45
回答 1查看 943关注 0票数 0

我对歌郎比较陌生,也不完全了解溪流。我有一个功能(断路器功能),是进行休息呼叫。我让它工作,但它只是流的"responseBody“回来。实际上,我想将流的整个请求流回身体和头一起返回。

当我试图在“头”上使用类似的方法时,我会得到一个错误,即标题是不可流的。

有什么好的/最好的方法来完成这个任务吗?谢谢。以下是我的职责。

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-27 17:17:32

您正在寻找httputil.DumpResponse函数。

代码可能会更改为类似于

代码语言:javascript
复制
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
}

旁注,

此版本的代码试图尽早返回错误,并关闭响应体。它没有经过测试,只是在飞行中写的,小心地使用。

代码语言:javascript
复制
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
    })
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52042111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档