14

RoboSpice を使用するアプリケーションを作成しています。リクエスト リスナー onRequestFailure( SpiceException arg0 ) で、エラーが 401 HTTP エラーが発生した結果であることを確認する方法はありますか?

トークンの有効期限が切れたときに 401 エラーを返すバックエンド サービスがあります。それが発生した場合、ユーザーに資格情報の再入力を促す必要があります。

401 HTTP エラーが具体的に発生したことを知る方法はありますか?

以下は私のリクエストの一例です。

   public class LookupRequest extends SpringAndroidSpiceRequest <Product> {

public String searchText;
public String searchMode;

public LookupRequest() {
    super( Product.class );
}

@Override
public Product loadDataFromNetwork() throws Exception {
    String url = String.format("%s/Lookup?s=%s&m=%s", Constants.BASE_URL, searchText, searchMode);
    Ln.d("Calling URL: %s", url);
    return getRestTemplate().getForObject(url, Product.class );
}
4

5 に答える 5

20

Spring-Android を詳しく調べたところ、401 またはネットワーク エラーが発生すると、getRestTemplate().getForObject(...) が HttpClientErrorException をスローするようです。

Robo Spice でその例外をキャッチする場所を見ると、processRequest 関数の RequestProcessor.java でキャッチされていることがわかりました。Java 例外クラスから継承する SpiceException 内で、Spring-Android 例外を throwable として渡します。

したがって、RoboSpice RequestListener 内で次のことを実行して、401 UNAUTHORIZED 例外かどうかを確認します。

    private class MyRequestListener implements RequestListener<RESULT> {

    public void onRequestFailure( SpiceException arg0 ) {

        if(arg0.getCause() instanceof HttpClientErrorException)
        {
            HttpClientErrorException exception = (HttpClientErrorException)arg0.getCause();
            if(exception.getStatusCode().equals(HttpStatus.UNAUTHORIZED))
            {
                Ln.d("401 ERROR");
            }
            else
            {
                Ln.d("Other Network exception");
            }
        }
        else if(arg0 instanceof RequestCancelledException)
        {
            Ln.d("Cancelled");
        }
        else
        {
            Ln.d("Other exception");
        }
    };

    public void onRequestSuccess( RESULT result ) {
        Ln.d("Successful request");
    }
}
于 2013-02-15T16:21:17.417 に答える
2

私はRoboSpiceでGoogle httpクライアントを使用していますが、同じ問題がありますが、簡単に解決でき、結果のオブジェクトrequest.setThrowExceptionOnExecuteError(false);の応答コードを確認できましたHttpResponse

編集: 要求されたコード スニピット

HttpRequest request = getHttpRequestFactory().buildPostRequest(new GenericUrl(URL), content);
request.setThrowExceptionOnExecuteError(false);
HttpResponse response = request.execute();

switch(response.getStatusCode())
    {
        case HttpStatusCodes.STATUS_CODE_UNAUTHORIZED:
            return new MyBaseResponse(responseBody);
        default:
            throw new RuntimeException("not implemented yet");
    }
于 2013-02-20T11:05:50.183 に答える