#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);
Если кто-нибудь знает лучшее решение, я был бы рад услышать от него.