2016-12-05 4 views
-1

この要旨は、移動にかなり一般的であるように思わ:`json.NewDecoder.Decode`が失敗した場合のレスポンスボディの保存方法を教えてください。このスニペットの

if err := json.NewDecoder(r.Body).Decode(&mr); err != nil { 
    return mr, err 
} 

しかし、どのように、私は実際にエラーが発生した場合にr.Bodyの文字列表現を取得するのですか?この場合、Zipが時には文字列であり時には整数であることを見つけるためにのみ、構造体を操作するのではなく、エラーログにこれを含めると便利です。

この時点でボディはすでに閉じられていますので、再度アクセスする方法はわかりません。

ボディを文字列にプリエンプティブにデコードし、後でそれをエンコードして構造体のマッピングを試みることは、余分なステップのようです。より良い方法がありますか?

答えて

2

ボディを保存する場合は、ボディをアンマーシャリングする前に保存してください。

+0

私は 'ioutil.ReadAll'を使用しないようにしたいと思っていましたが、他に何か動作するかどうかはわかりません。 [This](https://groups.google.com/forum/#!topic/golang-codereviews/e9bnpB5bpTw)は1.8で非常に役立ちます。 – sean

+0

@sean:レスポンス本文が必要な場合は、 'ioutil.ReadAll'を避ける理由はありません。あなたがあまりにも多くのデータをバッファリングすることを心配しているなら、あなたはjson.Decoderでそれを妨げていません。予期しない大きな応答を止めるには 'io.LimitedReader'を使う必要があります。 – JimB

関連する問題