2012-04-16 50 views
0

我使用Apache的HttpClient类发布数据到网站表单。窗体检索使用以下几行代码:根据HttpGet使用Apache的HttpClient返回的表单发布到

HttpGet get = new HttpGet(url); 
HttpResponse response = client.execute(get); 

我检索窗体的网站需要身份验证才能访问窗体。如果请求未通过身份验证,网站会将请求重定向到登录表单页面,随后在成功验证后重定向回原始页面。

我想干净地检测GET请求是否返回登录页面或所需的表单页面,以便我可以POST登录数据或表单数据。我能想到的唯一方法就是从响应实体的InputStream中读取内容并解析每一行。但这似乎有点令人费解。我之前没有使用Apache HttpComponents api,所以我不确定这是否是完成我想完成的唯一和最好的方法。

编辑:为了澄清问题,我问是否有一套方法来处理与Apache的HttpClient形式。我有点知道如何实现我期待的目标,但它看起来非常难看,我希望有一种更简单快捷的方法来实现它。例如,如果有一些方法来做到以下几点:

HttpGet get = new HttpGet(url); 
HttpResponse response = client.execute(get); 
if(parseElements(response.getEntity()).hasFormWithId("login")) { 
    // post authentication data  
} else { 
    // post actual form data 
} 

因为我缺乏经验与Apache的HttpClient的API的,我不知道如果有什么我在API中寻找对于意图过于抽象的API。

回答

0

您可以通过设置HttpClient的参数

DefaultHttpClient client = new DefaultHttpClient(); 
client.setDefaultHttpParams(client.getParams().setBoolean(ClientPNames.HANDLE_REDIRECTS, false)); 

即禁用处理自动重定向修改HttpClient的行为。

参见:

+0

什么将是禁用自动重定向的优势在哪里?我想我在问是否有面向对象的方式来处理Apache的HttpClient的表单。我将编辑第一篇文章以包含一个示例。 – mburke13 2012-04-17 19:21:09

+0

如果您禁用未经授权的请求的自动重定向,您将在'位置'标题中获得'HTTP状态代码30x'和目标位置的响应。根据响应的Http状态代码,您可以发送登录信息,甚至不需要解析HTML内容。更“面向对象”的方法是实现自己的[RedirectStrategy](http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/AbstractHttpClient.html )。策略会做类似于我上面描述的事情。 – andih 2012-04-18 02:49:22