2016-02-01 6 views
0

-je obtenir du serveur JSON vide (« {} ») comme une réponse de suppression avec le code 204.Retrofit2 204 Aucun contenu n'a exception contenu

Dans okhttp3.internal.http.HttpEngine classe il y a cette chose ennuyeuse qui est jeté:

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

Si vous essayez de renvoyer quelque chose sans contenu (côté serveur) dans les en-têtes, Content-Length est supérieur à 0;

Des idées non côté serveur comment résoudre ce problème?

+0

Pourquoi la longueur du contenu est-elle supérieure à 0 avec 204? – Blackbelt

+0

Je ne sais pas. il renvoie 2 pour la réponse "{}" et 2432 pour le contenu vide. (essayé avec Postman). – Alpha

Répondre

2

Vous pouvez intercepter le ProtocolException dans un intercepteur et renvoyer un espace réservé 204 Response. Mises en garde avec cette approche - 1) vous pouvez finir par piéger d'autres erreurs de protocole (trop de redirections, etc.). Si c'est un problème, vous pouvez comparer e.getMessage() au message d'exception de okhttp et renvoyer l'exception s'il n'y a pas de correspondance. 2) vous n'avez toujours pas accès à la réponse d'origine, donc si vous n'avez pas de chance si vous avez besoin d'inspecter l'un des en-têtes retournés.

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; 
    } 
}); 
+0

Je pourrais juste finir par faire exactement chose. J'ai déjà Interceptor pour l'authentification, donc je suppose que je peux ajouter des choses supplémentaires dans ce domaine. – Alpha