2013-10-21 185 views
0

我正在开发使用http客户端的应用程序,并且我想知道一些优雅的问题。 这是标准的java http客户端,它在后台线程中工作,并通过事件(通过覆盖方法实现的女巫)传递数据。我有背景请求特殊类,实现方法sendRequest将()http客户端体系结构

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()。乍看起来很简单:只要处理401,如果是因为过期的cookie调用方法Login()(在我的设计中,它看起来像getSomeData)。但是我想要的是,不仅仅是再次登录,我需要请求数据,我没有得到,因为错误。当然,我可以实现调用每个交换机登录()方法,像这样:

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

但)在登录(实现的登录事件法; 此外,我可以只写sendRequest(字符串authdata),subscrube为HttpHandler和通过递归调用方法多数民众赞成实现此代码。但我觉得,这不是一个很好的决定。 我真的希望,有人已经解决了这个问题,并且有办法,把它变成漂亮的代码! 谢谢,如果你能读到此结尾:)

+0

使用健壮和经过测试的http客户端框架是否有任何缺点?例如。 HttpApacheClient? - 我广泛使用那个用于任何HTTP通信。 – Antoniossss

+0

它解决了我的问题吗?我可以轻松控制请求状态吗?例如,当我的请求没有返回401错误的数据时,我需要再次进行请求授权的情况? – Vitaliy

+0

当然!阅读文档和API。它是Java的完整http客户端。如果你保留它,你会爱上它。 – Antoniossss

回答

1

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

相关问题