1

コード 204 の削除応答として、サーバーの空の json ("{}") から取得します。

クラスには、okhttp3.internal.http.HttpEngineスローされるこの厄介なものがあります。

  if ((code == 204 || code == 205) && response.body().contentLength() > 0) {
    throw new ProtocolException(
        "HTTP " + code + " had non-zero Content-Length: " + response.body().contentLength());
  }

ヘッダーにコンテンツのないもの (サーバー側) を返そうとすると、Content-Length は 0 よりも大きくなります。

この問題を解決するためのサーバー側以外のアイデアはありますか?

4

2 に答える 2

5

をインターセプターにトラップしてProtocolException、プレースホルダー 204 を返すことができResponseます。このアプローチの注意点 -- 1) 他のプロトコル エラー (リダイレクトが多すぎるなど) をトラップしてしまう可能性があります。これが懸念される場合は、e.getMessage()okhttp の例外メッセージと比較して、一致しない場合は例外を再スローできます。2) まだ元の応答にアクセスできないため、返されたヘッダーのいずれかを検査する必要がある場合に運が悪い場合。

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addNetworkInterceptor(new Interceptor() {
  @Override
  public Response intercept(Chain chain) throws IOException {
      Response response;
      try {
        response = chain.proceed(chain.request());
      } catch (ProtocolException e) {
        response = new Response.Builder()
            .request(chain.request())
            .code(204)
            .protocol(Protocol.HTTP_1_1)
            .build();
      }
    return response;
  }
});
于 2016-02-02T05:45:32.830 に答える