Как мне получить заголовки из HttpResponse с помощью Spring resttemplate и androidannotations в случае ошибки?

#android #spring #rest #error-handling #android-annotations

#Android #spring #rest #обработка ошибок #android-аннотации

Вопрос:

Как мне получить заголовки из HttpResponse с помощью Spring resttemplate и androidannotations в случае ошибки?

Я знаю, как получить их в случае отсутствия ошибки, но они мне нужны в случае ошибки, потому что api, который я хочу использовать, отправляет minorstatuscode для очистки httpstatuscode.

Комментарии:

1. github.com/excilys/androidannotations/wiki/Rest-API посмотрите на ResponseEntity

2. Этот точный параметр равен нулю, если есть ошибка.

3. ДА.. Я предполагаю, что при возникновении ошибки генерируется исключение, поэтому ничего не возвращается. Я ничего не могу найти в методе onRestClientExceptionThrown для получения заголовков, так где еще я мог бы искать?

4. странно. ResponseEntity<EntityType> должен выдавать вам http-заголовки. хммммммм.

5. вы уверены, что это должно происходить и при ошибках ?.. потому что это не имеет смысла.. как это должно работать? Существует окончательное исключение, выдаваемое либо customerrorhandler, либо вызывающему restclient.method().. следовательно, возвращаемое значение должно быть null.

Ответ №1:

В принципе, я нашел решение.

RestClient

 @Rest(rootUrl = "https://proji.at/japi/v1", converters = { MappingJackson2HttpMessageConverter.class }, interceptors = { HttpBasicAuthenticatorInterceptor.class })
public interface ProjiRestClient extends RestClientErrorHandling {
    RestTemplate getRestTemplate();
}
  

Обработчик ошибок:

 @EBean
public class ProjiResponseErrorHandler implements ResponseErrorHandler {
    private static final String TAG = "ProjiResponseErrorHandler";

    @Override
    public void handleError(ClientHttpResponse response) throws     IOException {
        int minor = 0;
        try {
            minor = Integer.parseInt(response.getHeaders().    getFirst("minor"));
        } catch (Exception e) {
            // TODO: handle exception
        }
        Log.i(TAG, "Response statuscode: "   response.getStatusCode()       " minor: "
                  response.getHeaders().getFirst("minor"));

        throw new HttpMethodException(response.getStatusCode().value(),     minor);
    }

    @Override
    public boolean hasError(ClientHttpResponse response) throws     IOException {

        Log.i(TAG, "Response statuscode: "   response.getStatusCode());
        if (response.getStatusCode().value() >= 400) {
            return true;
        }
        return false;
    }

}
  

Фрагмента, который использует RestClient:

 @RestService
ProjiRestClient restClient;
@Bean
ProjiResponseErrorHandler projiErrorhandler;

@AfterInject
void afterInject() {
    restClient.getRestTemplate().setErrorHandler(projiErrorhandler);
}
  

И вы начинаете вызывать методы из RestClient.

 ResponseEntity<User> respone = restClient.getAuth(auth);
  

Если кто-нибудь знает лучшее решение, я был бы рад услышать от него.