bugfix> java > 投稿

私は映画のリストを取得するAndroidサンプルアプリに取り組んでいますhttp://www.omdbapi.com/。

RESTサービスは次のとおりです。

http://www.omdbapi.com/?s=star&apikey=d497e644

Retrofitを使用してクライアントを記述しています。

public interface OmdbApi {
    @Streaming
    @GET("./")
    @Headers({"Cache-control: no-cache"})
    Call<Search> search(@Query("s") String search, @Query("apikey") String apiKey);
    @Streaming
    @GET("./")
    @Headers({"Cache-control: no-cache"})
    Call<FilmDetail> getFilm(@Query("i") String uid, @Query("apikey") String apiKey);
}

完全なソースコードが利用可能ですここに。

アプリケーションを実行すると、次の応答が得られます(logcatから取得)。

OK http://www.omdbapi.com/?s=star&apikey=d497e644 (108ms)
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Cache-Control: public, max-age=86400
Expires: Sat, 26 May 2018 14:28:18 GMT
Last-Modified: Fri, 25 May 2018 05:39:04 GMT
Vary: *, Accept-Encoding
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
CF-Cache-Status: HIT
Server: cloudflare
CF-RAY: 4208b00c817b3db9-MXP
Connection: Keep-Alive

そして、次のエラー:

java.net.ProtocolException: unexpected end of stream
        at okhttp3.internal.http1.Http1Codec$ChunkedSource.read(Http1Codec.java:455)
        at okio.RealBufferedSource.read(RealBufferedSource.java:47)
okio.RealBufferedSource.exhausted(RealBufferedSource.java:57)
okio.InflaterSource.refill(InflaterSource.java:102)
okio.InflaterSource.read(InflaterSource.java:62)
okio.GzipSource.read(GzipSource.java:80)
okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:237)
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
        at okhttp3.RealCall.execute(RealCall.java:77)
        at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:91)
com.abubusoft.filmfinder.service.repository.FilmRepository.lambda$findFilm$0$FilmRepository(FilmRepository.java:18)
com.abubusoft.filmfinder.service.repository.FilmRepository$$Lambda$0.run(Unknown Source:20)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)

少し調査したところ、問題は応答に Transfer-Encoding: chunked が含まれていることがわかった 。この問題を解決するにはどうすればよいですか?

ありがとうございました。

回答 1 件
  • さらに調査した後:

    @Streaming を削除します  注釈..それらは役に立ちません。

    私が行ったテストは、ファイアウォールの背後にあるPC上のエミュレーターで行われました。

    OkHttp  何年も前に問題がありましたが、チャンク転送は完全に管理されています。

    同じマシン上で、ブラウザーで同じURLを呼び出しても問題は発生しません

    最後に、JUnitテストとAndroidエミュレーターで別のマシンを試してみましたが、問題はありませんでした。

    ようやくコードが機能するようになったので、アプリの開発に使用した環境では、転送エンコードチャンクに問題があります。

    完全なソースコードは次の場所にあります。

    アンドロイドアプリ

    junitテスト

    私は問題が何であるかを正確に見つけなければなりません、今ではレトロフィットでもクライアント定義でもOkHttpでもないことを確信しています。

    私の経験が他の開発者に役立つことを願っています。

    バイエズ

あなたの答え