Retrofit は初めてです。私はボレーを使用したことがあり、レトロフィットが好きです。 POSTを実行しようとしたときにこのnon-descriptiveエラーメッセージが表示されたときに、Retrofitを選択しようとしていました。
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に委任するつもりはありません。
おそらく、TestDriver.main
にcatch句を追加する必要があります。
try {
service.logon();
} catch (RetrofitError e) {
System.out.println(e.getResponse().getStatus());
}
ErrorHandler
を作成します。エラーをキャッチしても多くの追加情報は得られないことがわかりましたが、RetrofitのカスタムErrorHandler
を作成すると、次のように実際のエラーをさらに詳しく調べることができます。
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();
Retrofit Page 。のカスタム同期エラー処理セクションから
上記の構成コードに示すように、ログレベルを[〜#〜] 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;
}
}
}