18

私はレトロフィットが初めてです。Volley を使ったことがあるのですが、Retrofit が好きです。POST を実行しようとしたときに、この非常に説明のつかないエラー メッセージが表示されたとき、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 に委任するつもりはありません。

4

3 に答える 3

20

おそらく、catch 句を に追加する必要がありますTestDriver.main

try {
  service.logon();
} catch (RetrofitError e) {
  System.out.println(e.getResponse().getStatus());
}
于 2014-01-12T18:57:23.857 に答える
4

残念ながら、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;
        }
    }

}
于 2014-09-10T20:25:34.073 に答える