2016-12-31 3 views
0

Ich verwende Android Annotations, um Anfragen an einen Server zu stellen. Ich habe den folgenden Abfangjäger auf der Grundlage der Antwort auf diesen questionAndroid Annotations Logging Interceptor Ende-von-Eingabefehler

public class LoggingInterceptor implements ClientHttpRequestInterceptor { 

@Override 
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { 
    ClientHttpResponse response = execution.execute(request, body); 

    //It works after removing these two lines 
    String responseString = stringOf(response.getBody()); 
    Log.d("RESPONSE", responseString); 

    return response; 
} 

public static String stringOf(InputStream inputStream) { 
    inputStream.mark(Integer.MAX_VALUE); 
    BufferedReader r = new BufferedReader(new InputStreamReader(inputStream)); 
    StringBuilder strBuilder = new StringBuilder(); 
    String line; 
    try { 
     while ((line = r.readLine()) != null) 
      strBuilder.append(line); 
    } catch (IOException ignored) {} 
    try { 
     inputStream.reset(); 
    } catch (IOException ignored) {} 
    return strBuilder.toString(); 
} 
} 

Dies ist jedoch die folgende Ausnahme produziert: org.springframework.http.converter.HttpMessageNotReadableException: Kann nicht JSON lesen: Kein Inhalt aufgrund abzuzubilden End-of-Eingang

Wenn ich die folgenden Zeilen aus dem Abfangjäger entfernen:

String responseString = stringOf(response.getBody()); 
Log.d("RESPONSE", responseString); 

Alles funktioniert gut.

Hier ist meine RestClient Schnittstelle:

@Rest(rootUrl= "http://107.206.158.62:1337/api/", converters={MappingJackson2HttpMessageConverter.class}, interceptors = { LoggingInterceptor.class }) 
public interface IRestClient { 

    @Post("users/register/") 
    @Accept(MediaType.APPLICATION_JSON) 
    User register(@Body User user); 

} 

Benutzermodell:

public class User implements Serializable { 

    String first_name; 

    String last_name; 

    String email; 

    String password; 

    public User(){} 

    public User(String first_name, String last_name, String email, String password) { 
     this.first_name = first_name; 
     this.last_name = last_name; 
     this.email = email; 
     this.password = password; 
    } 

    //Getters and Setters 
} 

RestClient Anruf in meiner Tätigkeit

@Click(R.id.bRegister) 
@Background 
void createAccount() { 
    User u = restClient.register(new User("Test Fname", "Test Lname", "[email protected]", "testpass")); 
    Log.d("User last name", u.getLast_name()); 
} 

Der Server erzeugt die folgende json:

{"first_name":"Test Fname","last_name":"Test Lname","email":"[email protected]"} 

Ich mag würde in der Lage sein, den Körper von jeder Antwort zu protokollieren, und dann das Antwortobjekt zurück. Aber es scheint, dass das Lesen des InputStream aus der Antwort zuerst einige Probleme verursacht. Ich laufe in die obige Ausnahme

Log.d("RESPONSE", responseString); 

zeitigt die richtige Antwort des Servers, aber dann, wenn die MappingJackson2HttpMessageConverter Kicks.

Jede Hilfe wäre sehr dankbar! Frohes neues Jahr! :)

Antwort

1

Ich denke, es ist weil, wenn Sie Antwort lesen Sie verbrauchen es und dann ist es leer. Der Interceptor agiert vor dem Parsen des Inhalts, also verbrauchen Sie Ihre Antwort, um sie zu protokollieren, und der Parser findet sie leer.

Antwort protokollieren, einfach weil das Lesen des Inhalts nicht der beste Weg ist, dies zu tun. Ich weiß nicht, die beste Technik, aber ich halte kommentiert Antwort Protokollierung und dann, wenn ich ein Problem habe ich aufhören mit Debug auf einer Linie in die Schnittverfahren und Protokollanforderung durch Uhren-Panel, so etwas wie

Log.d("RESPONSE", stringOf(response.getBody())) 

Schreiben Dann Sie können eingeloggte Daten in das Android Monitor-Panel einlesen. Offensichtlich ist diese Antwort jetzt leer, so dass sie nicht geparst und verarbeitet wird, aber wenn Sie brauchen, können Sie Ihre Antwort ohne Neuaufbau Ihres Projekts protokollieren

+0

Vielen Dank! Das hat mir geholfen – eHero