我正在开发使用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和通过递归调用方法多数民众赞成实现此代码。但我觉得,这不是一个很好的决定。 我真的希望,有人已经解决了这个问题,并且有办法,把它变成漂亮的代码! 谢谢,如果你能读到此结尾:)
使用健壮和经过测试的http客户端框架是否有任何缺点?例如。 HttpApacheClient? - 我广泛使用那个用于任何HTTP通信。 – Antoniossss
它解决了我的问题吗?我可以轻松控制请求状态吗?例如,当我的请求没有返回401错误的数据时,我需要再次进行请求授权的情况? – Vitaliy
当然!阅读文档和API。它是Java的完整http客户端。如果你保留它,你会爱上它。 – Antoniossss