1

我从服务器空 json ("{}") 获取代码为 204 的删除响应。

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 回答
3

如果使用方式稍有不同,则可以避免这种情况。代替:

@DELETE("vehicles/{id}/")
Observable<Response<BaseResponse>> deleteVehicle(@Header("Authorization") String token, @Path("id") Long vehicleId);

我用:

@HTTP(method = "DELETE", path = "vehicles/{id}/", hasBody = true)
Observable<Response<BaseResponse>> deleteVehicle(@Header("Authorization") String token, @Path("id") Long vehicleId);
于 2018-10-09T16:23:04.073 回答