Как получить причину ошибки json.NewDecoder (body) .Decode (), когда происходит таймаут http? - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь найти способ выяснить причину ошибки при JSON-декодировании http.Response.Body

if err := json.NewDecoder(resp.Body).Decode(&lResp); err != nil {
    // Get the cause of err
}

Тип errerrors.Cause(err) с использованием либо github.com/pkg/errors, либо github.com/friendsofgo/errors) равно *errors.errorString.

Итак, что я могу сделать прямо сейчас, это полная противоположность проверки типа ошибки, а именно:

if strings.HasSuffix(cause.Error(), "(Client.Timeout exceeded while reading body)") {
    //...
}

Я могу попытатьсяиспользуйте ioutil.ReadAll(), и тогда я получу *http.httpError в качестве ошибки при истечении времени ожидания.

Основная причина в том, что я не хочу получать частично читаемую структуру JSONв ошибке - только причина ошибки и с текущим способом, это делается (ошибка возвращается) я получаю:

main.ListingResponse.DataSources: struct CustomType{ /* partially read JSON struct ... */ }.net/http: request canceled (Client.Timeout exceeded while reading body)

1 Ответ

0 голосов
/ 06 ноября 2019

Хорошо, я закончил читать тело ответа в []byte, а затем расшифровывать его с помощью json.Unmarshal()

bb, err := ioutil.ReadAll(resp.Body)
if err != nil {
    var netError net.Error
    if errors.As(err, &netError) {
        log.Printf("netError %v", netError)
        // handle net.Error...
        return nil, netError
    }
    // handle general errors...
    return nil, netError
}

var lResp LResponse
if err := json.Unmarshal(bb, &lResp); err != nil {
    return nil, errors.Wrap(err, "failed to unmarshal LResponse")
}

Я все еще ищу решение для использования json.NewDecoder(resp.Body).Decode(&str) дляизбегайте копирования всего тела в память.

Если кто-нибудь знает способ сделать это, пожалуйста, добавьте свой ответ.

...