16

Retrofit 1.6.0、OkHTTP 2.0.0、および OkHTTP-UrlConnection 2.0.0 を使用します。

Retrofit を使用して、存在しない URL へのサービスへの POST を実行しています。期待どおり、失敗のコールバックが呼び出されます。ただし、RetrofitError パラメータには応答がありません。を使用して返された HTTP ステータス コードを取得したいと思います。

error.getResponse().getStatus()

しかし、getResponse() は null を返すので、できません。

getResponse() が null である理由と、ステータスを取得するにはどうすればよいですか?

ありがとう。

また、予想どおり、受信しているエラーは UnknownHostException です。繰り返し: このエラーが予想されます。HTTP ステータス コードを取得する方法、または error.getResponse() が null を返す理由を知りたいです。

編集:ここにいくつかのコードがあります:

RestAdapterBuilderClass.java
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("http://badURL.DoesntMatter/");
            .setRequestInterceptor(sRequestInterceptor)
            .setLogLevel(RestAdapter.LogLevel.FULL)
             .build();
    sService = restAdapter.create(ServiceInterface.class);

ServiceInterface.java
    @POST("/Login")
    void login(@Body JsonObject body, Callback<String> callback);

CallbackClass.java
    @Override
    public void failure(RetrofitError error) {
        if (error.getResponse() == null) {

            // error.getResponse() is null when I need to get the status code
            // from it.

            return;
        }
    }
4

4 に答える 4

7

RetrofitErrorisNetworkError()には、ネットワークの問題が原因で失敗した要求を検出するために使用できるメソッドがあります。私は通常、次のような小さなヘルパー メソッドを追加します。

public int getStatusCode(RetrofitError error) {
    if (error.isNetworkError()) {
        return 503; // Use another code if you'd prefer
    }

    return error.getResponse().getStatus();
}

その結果を使用して、追加の障害ロジック (401 でログアウト、500 でエラー メッセージを表示など) を処理します。

于 2014-06-24T20:07:25.733 に答える
1

Just to expand on @lyio's answer, I found from Fabric logging that getKind() sometimes returns UNEXPECTED and then if you parse the message you get timeouts and connection issues so I wrote the utility class below.

public class NetworkUtils {
    // Compiled from Fabric events
    private static final List<String> networkErrorStrings = new ArrayList<>(Arrays.asList(
        "Unable to resolve host",
        "Connection closed by peer",
        "Failed to connect",
        "timeout",
        "Connection timed out"));

    public static boolean isNetworkError(@Nullable RetrofitError retrofitError) {
        if (retrofitError != null) {
            if (retrofitError.getKind() != RetrofitError.Kind.NETWORK) {
                for (String error : networkErrorStrings) {
                    if (retrofitError.getMessage().contains(error)) {
                        return true;
                    }
                }
            } else {
                return true;
            }
        }

        return false;
}

}

于 2016-11-21T22:41:49.670 に答える
0

私は Retrofit 2 を使用しています。あなたの場合のようにエンドポイントの URL が「/」で終わり、インターフェースで「/」で始まる場合、[@POST("/Login")] がこの問題を引き起こします。.setEndpoint() メソッドから「/」を削除します

于 2016-01-16T03:28:04.993 に答える