私はJSONとの間でリクエストとレスポンスの型をエンコード/デコードする関数を指定する必要があるライブラリ(go-kit)を使用しています。エンコードするには、単純です:Golang jsonのデコードでインタフェース{}のデコードに失敗しました
func EncodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
return json.NewEncoder(w).Encode(response)
}
HTTPサーバーを作成するためにこの関数を渡しても問題ありません。私のアプリケーション内のすべての単一のRPCについて
func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) {
var req UppercaseRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
return nil, err
}
return req, nil
}
:しかし、要求のための彼らの提案されたアプローチは、フォームの別の関数を作ることです。コードをDRYにして、何百ものほとんど同じメソッドを使用しないようにしたいと思っています。 、私はそう、JSONを不幸に
DecodeRequest(UppercaseRequest{}}
:
func DecodeRequest(req interface{}) httptransport.DecodeRequestFunc {
return func(_ context.Context, r *http.Request) (interface{}, error) {
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
return nil, err
}
return req, nil
}
}
この関数は、そのように呼び出すことができます。そのため、私は与えられた要求の種類をデコードクロージャを生成する機能を書き込もうとしましたreqのタイプが実際にはmypackage.UppercaseRequestであっても、デコードは失敗します。私はここからどこに行くべきか分からない。リクエストタイプごとにメソッドを記述する必要がない方法がありますか?デコード関数がこの型が実行時に何であるかを理解するために何らかの方法がありますか?前もって感謝します!
ここは、問題を実証行く遊び場です: https://play.golang.org/p/GgHsLffp1G
JSONデコードerrrorは何ですか?タイプスイッチが役立つかもしれませんし、パッケージにはランタイムタイプの識別のための多くのツールがあります。 – Sridhar
@Sridhar私が呼び出す場合DecodeRequest(CountRequest {})私は 得る "HTTP:パニックサービング[:: 1]:55992:インタフェース変換:インタフェースはマップ[ストリング]インターフェース{}、ないuser.CountRequest" と私が使用する関数を変更すると... Decode(req)とDecodeRequest(&CountRequest {})を呼び出す "http:panic serving [:: 1]:56375:インターフェイス変換:インターフェイスは* user.CountRequestではないuser.CountRequest " –
CountRequestとは何ですか?マップ[文字列]インターフェース{}?あなたは本当に[this](http://www.stackoverflow.com/help/mcve)に従うべきです。おそらくDecode(Req)を試してDecodeRequest(CountRequest {})を呼び出すでしょうか? – Sridhar