http 客户端架构

问题描述 投票:0回答:1

我正在使用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();
    }

还有子类,用于 Web 服务器的 API,它具有类似的方法:

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()。乍一看很简单:只需处理 401,如果是因为 cookie 过期,则调用方法 Login() (在我的设计中,它看起来像 getSomeData)。但我想要的不仅仅是再次登录,我还需要请求数据,但由于错误而未能获取数据。当然,我可以实现在每个开关中调用 Login() 方法,如下所示:

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

但是登录事件是在Login()方法中实现的; 另外,我可以编写 sendRequest(string authdata),订阅 HttpHandler 并通过实现此代码的递归调用方法。但我认为,这不是一个很好的决定。 我真的希望有人已经解决了这个问题,并且有办法将其变成漂亮的代码!

谢谢,如果您能读到最后

java android
1个回答
1
投票

至于回答不评论。 尝试使用 http 客户端框架 - 我更喜欢 Apache HTTPClient。它提供对请求和响应的广泛控制。此外,它支持最常见的方法,如 GET POST 等。还提供 Cookie 管理、重定向处理和 SSL 支持。不要发明已经发明的东西。 HttpClient - 使用 v4.x

© www.soinside.com 2019 - 2024. All rights reserved.