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! :)
Vielen Dank! Das hat mir geholfen – eHero