2016-12-31 9 views
0

Я использую аннотации Android для отправки запросов на сервер. Я создал следующий перехватчик на основе ответа на этот questionАннотации аннотаций Android Ошибка входа в систему перехватчика

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(); 
} 
} 

Однако это вызывает следующее исключение: org.springframework.http.converter.HttpMessageNotReadableException: не удалось прочитать JSON: Нет содержимого для отображения из-за конец входного текста

Когда я удалить следующие строки из перехватчика:

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

Все отлично работает.

Вот мой RestClient интерфейс:

@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); 

} 

пользователя Модель:

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 вызов в моей деятельности

@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()); 
} 

Сервер производит следующее:

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

я хотел бы иметь возможность войти в тело каждого ответа, а затем возвращают объект ответа. Но, похоже, что чтение InputStream из ответа сначала вызывает некоторые проблемы.

Log.d("RESPONSE", responseString); 

приносит правильный ответ сервера, но я бегу в выше исключения, когда MappingJackson2HttpMessageConverter пинки в.

Любая помощь будет принята с благодарностью! Счастливого Нового года! :)

ответ

1

Я думаю, это потому, что, когда вы читаете ответ, вы его потребляете, а затем он пуст. Перехватчик действует до анализа содержимого, поэтому вы используете свой ответ для его регистрации, а затем парсер находит его пустым.

Ответ на регистрацию просто как чтение его содержимого - это не лучший способ сделать это. Я не знаю, лучший метод, но я продолжаю комментировали регистрацию ответа, а затем, когда у меня есть проблема, я остановить с отладки на линии в методе перехвата и регистрации запроса на часы панели, писать что-то вроде

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

Тогда вы можете читать зарегистрированные данные на панели Android Monitor. Очевидно, что этот ответ теперь пуст, поэтому он не будет анализироваться и обрабатываться, но когда вам нужно, вы можете зарегистрировать свой ответ, не перестраивая свой проект.

+0

Спасибо! Это помогло мне – eHero