0

Retrofit を使用して REST リクエストを作成し、対応するモデル オブジェクトを作成しています (gson で @SerializedName アノテーションを使用)。ただし、ConversionException が発生する特定の GET リクエストが 1 つありますが、その原因を突き止めるのに苦労しています。さまざまなパラメーターを使用して、ほぼ同時に 10 ~ 20 の同様の GET 要求を行い、それらの約 90% が正しく返されます。残りは ConversionException で失敗します。

retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT が必要でしたが、行 1 列 1 で STRING でした

この変換例外が発生すると、(アプリを強制終了せずに) その要求を再度実行しようとすると、常に同じ変換例外が発生します。アプリを強制終了して完全に新しく起動すると、おそらく機能します。

この変換例外が発生したリクエストについて、ブラウザーで json レスポンスを調べてみましたが、常に正しいように見えます。「失敗した」リクエストと成功したリクエストを何度も比較しましたが、json は同じように見えます。

私の質問:

1) 私が知る限り、応答データは常に正しいのに、これらの変換例外が発生するのはなぜですか?

2) レトロフィットは GET リクエストに対して何らかのキャッシングを行いますか? これは、アプリケーションを強制終了して再起動するまで、失敗したリクエストの再リクエストが失敗し続ける理由を説明している可能性があります。

ありがとう!

4

1 に答える 1

1

1) 私が知る限り、応答データは常に正しいのに、これらの変換例外が発生するのはなぜですか?

次のようなデータが予想されます。

{"foo":"bar"}

しかし、Gson は次のようなものを見つけました。

Hello!

JSON オブジェクト (別名{文字) で始まることを期待していましたが、代わりに文字列のような文字が見つかりました。

2) レトロフィットは GET リクエストに対して何らかのキャッシングを行いますか? これは、アプリケーションを強制終了して再起動するまで、失敗したリクエストの再リクエストが失敗し続ける理由を説明している可能性があります。

Retrofit にはキャッシュがまったくありません。

使用している HTTP クライアントGETによっては、ヘッダーに応じてリクエストの応答がキャッシュされる場合があります。通常、HTTP クライアントで動作をキャッシュするにはオプトインする必要があるため、それを行っていない場合は有効になっていないと思います。

于 2014-02-25T05:47:12.453 に答える