0

http クライアントを使用してアプリケーションを開発していますが、エレガントな問題を作成したいと考えています。これは、バックグラウンド スレッドで動作し、イベント (オーバーライド メソッドによって実現される魔女) によってデータを渡す標準的な Java HTTP クライアントです。メソッド sendRequest() を実装するバックグラウンドリクエスト用の特別なクラスがあります

protected void sendRequest(final String url)  {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                URI website = null;
                try {
                    website = new URI(url);
                } catch (URISyntaxException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
                HttpGet request = new HttpGet();
                request.setURI(website);
                HttpResponse response = null;
                try {
                    response = client.execute(request, httpContext);
                } catch (IOException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
                if (response != null)
                {
                    HttpEntity entity = response.getEntity();
                    try {
                        InputStream is = entity.getContent();
                        if (Debug.isDebuggerConnected()==true)
                        {
                            String data = convertStreamToString(is);
                            int code = response.getStatusLine().getStatusCode();                          
                            if (httpEvent!=null)
                                httpEvent.HttpResponseArrived(data, code);
                        }
                        else
                            httpEvent.HttpResponseArrived(convertStreamToString(is),response.getStatusLine().getStatusCode());
                        }
                    catch (IOException e) {
                            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                    }
                }
            }
        });
        t.start();
    }

また、API から Web サーバーへの子クラスには、次のようなメソッドがあります。

public void getSomeData(SomeParams param)
    {
        sendRequest("http://xxx.yy"+gson.toJson(param));
        httpEvent = new HttpHandler()
        {
            @Override
            public void HttpResponseArrived(String data, int code)
            {
                switch (code)
                {
                    case 200:
                        //some code
                        break;
                    case 401:
                        //some code
                        break;

                }
            }
        };
    }

そして私の質問: 401 などのサーバー エラーをどのように処理するのが適切ですか? リクエストを送信するメソッド sendRequest() で、これを 1 か所で行う必要があります。一見すると非常に簡単です。401 を処理するだけで、期限切れの Cookie が原因である場合は、メソッド Login() を呼び出します (私の設計では、getSomeData のように見えます)。しかし、もう一度ログインするだけでなく、エラーのために取得できなかったデータを要求する必要があります。もちろん、次のように、すべてのスイッチで Login() メソッドの呼び出しを実装できます。

case 401:
                    {
                        Login(CurrentContext.AuthData.Login, CurrentContext.AuthData.Password);
                        break;
                    }

しかし、Login() メソッドで実装されたログイン イベント。また、sendRequest(string authdata) を記述し、HttpHandler をサブスクライブし、このコードを実装する再帰呼び出しメソッドを使用することもできます。しかし、それはあまり良い決断ではないと思います。誰かがすでにこの問題を解決していて、それを美しいコードに変える方法があることを本当に願っています! ありがとう、これを最後まで読んでくれたら:)

4

1 に答える 1

1

回答はコメントではありません。http クライアント フレームワークを使用してみてください - 私は Apache HTTPClient を好みます。リクエストとレスポンスを幅広く制御できます。さらに、GET POST などの最も一般的なメソッドをサポートしています。Cookie 管理、リダイレクト処理、SSL サポートも提供されています。すでに発明されているものを発明しないでください。 HttpClient - v4.x を使用

于 2013-10-22T06:47:38.217 に答える