Канал Голанга - PullRequest
       22

Канал Голанга

0 голосов
/ 27 августа 2018

Я относительно новичок в Голанге и не до конца понимаю потоки. У меня есть функция (функция выключателя), которая делает вызовы Rest. У меня это работает, но он только передает "responseBody" обратно. Я бы на самом деле хотел бы отослать весь запрос потока назад и Body, и Header вместе.

Когда я пытаюсь использовать аналогичный подход к «заголовку», я получаю сообщение об ошибке, что заголовок не может быть обработан.

Есть ли хороший / лучший способ сделать это? Спасибо. Ниже моя функция.

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
}

1 Ответ

0 голосов
/ 27 августа 2018

Вы ищете функцию 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
}

Примечания,

  • Вы можете рассмотреть вопрос о закрытии тела ответа, как указано в документации https://golang.org/pkg/net/http/#Client.Get

  • Похоже, переменная 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
    })
}
...