Ответ 1
Вероятно, вы хотите добавить предложение catch к TestDriver.main
:
try {
service.logon();
} catch (RetrofitError e) {
System.out.println(e.getResponse().getStatus());
}
Я новичок в Retrofit. Я использовал Volley, и я вроде как Retrofit. Я как раз собирался выбрать Retrofit, когда я столкнулся с этим сообщением без описательного при попытке выполнить POST.
Exception in thread "main" retrofit.RetrofitError
at retrofit.RetrofitError.httpError(RetrofitError.java:37)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:413)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:282)
at myapi.api.$Proxy7.logon(Unknown Source)
at myapi.api.TestDriver.main(TestDriver.java:94)
Ну, я должен сказать, что этот тип сообщения об ошибке примерно так же полезен, как теплый куртка в Сахаре.
Кто-нибудь знает, с чего начать с отладки этого типа сообщения? Я действительно не собираюсь делегировать REST api, который не предоставляет полезные сообщения об ошибках.
Вероятно, вы хотите добавить предложение catch к TestDriver.main
:
try {
service.logon();
} catch (RetrofitError e) {
System.out.println(e.getResponse().getStatus());
}
ErrorHandler
для дооснащения.Я обнаружил, что улавливание ошибки не предоставило много дополнительной информации, но создание настраиваемого ErrorHandler
для Retrofit позволило мне углубиться в фактическую ошибку, например:
class MyErrorHandler implements ErrorHandler {
@Override public Throwable handleError(RetrofitError cause) {
Response r = cause.getResponse();
if (r != null && r.getStatus() == 401) {
return new UnauthorizedException(cause);
}
return cause;
}
}
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setErrorHandler(new MyErrorHandler())
.setLogLevel(RestAdapter.LogLevel.FULL) // Do this for development too.
.build();
В разделе Пользовательская обработка синхронной обработки ошибок на Страница "Обновление" .
Установите уровень журнала FULL, как показано в приведенном выше коде конфигурации.
К сожалению RetrofitError (1.6.1) был сложным. 401 сделал getResponse() всегда возвращает значение null, из-за чего ему трудно определить, связана ли его проблема с подключением или проблема с проверкой подлинности. По крайней мере, для меня мне пришлось посмотреть сообщение, чтобы получить ошибку 401. Надеюсь, это поможет кому-то еще попытаться сделать что-то подобное.
public class RetrofitErrorHandler implements ErrorHandler {
@Override
public Throwable handleError(RetrofitError cause) {
if (cause.isNetworkError()) {
if(cause.getMessage().contains("authentication")){
//401 errors
return new Exception("Invalid credentials. Please verify login info.");
}else if (cause.getCause() instanceof SocketTimeoutException) {
//Socket Timeout
return new SocketTimeoutException("Connection Timeout. " +
"Please verify your internet connection.");
} else {
//No Connection
return new ConnectException("No Connection. " +
"Please verify your internet connection.");
}
} else {
return cause;
}
}
}