使用HttpURLConnection进行多个Http请求和响应

时间:2011-10-16 14:49:34

标签: java http httpurlconnection bots

我的时区下午好。

我正在开发一个非常简单的http机器人。我正在使用javax.net.ssl.HttpsURLConnection类,我必须发出多个请求。 代码片段:

HttpURLConnection urlConnection =
    (HttpURLConnection) new URL(url+"?"+firstParameters).openConnection();
urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
headerFields = urlConnection.getHeaderFields();
keys = headerFields.keySet();
for(String key : keys){
    if(key != null && key.contains("ookie")){
        cookies = urlConnection.getHeaderField(key);
        break;
    }
}
for(String cookie : cookies.split(";")){
    if(cookie.contains("JSESSION")){
        JSESSION = cookie.split("=")[1];
        break;
    }
}
document = new InputSource(urlConnection.getInputStream());
parser.setDocument(document);
attributesId.put("name",new ArrayList<String>(Arrays.asList(attributesNames)));
elementsIds.put("INPUT",attributesId);
elements = parser.getValues(elementsIds);
for(String attr : attributesNames){
    secondParameters = secondParameters.replaceAll("#r"+index,elements.get(attr));
}
urlConnection.getInputStream().close();
//Second call 
urlConnection = (HttpURLConnection) new URL(url2).openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Cookie", "JSESSIONID="+JSESSION);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
payload = new PrintWriter(urlConnection.getOutputStream());
payload.print(secondParameters);
payload.flush();
payload.close();

总结上面的代码,首先我做一个没有任何有效负载的请求,我能够从服务器看到正确的响应,但问题是当我发出第二个请求时(现在有了有效负载和JSESSION cookie),我收到的是他在第一次请求中收到的相同回复,看起来我再次提出第一个请求。 所以我的问题是,我做错了什么? 我只需要打开一个连接,然后更改标头和有效负载? 有任何与多个http请求相关的教程(使用混合方法,post和get)?

提前致谢

致以最诚挚的问候

1 个答案:

答案 0 :(得分:1)

我之前从未使用过HttpURLConnection。我通常使用Apache's HTTPClient code。在他们的主页上有很多关于它的文档和教程。

我找不到关于HttpURLConnection的任何教程,但我试了一下。这是我的小程序,类似于你的程序。

  

http://pastie.org/2706758

似乎有效:

  1. 它首先请求获取会话cookie。
  2. 它处理响应标头以获取cookie。
  3. 它发出第二个请求,要求在请求中使用cookie验证会话。
  4. 如果使用了正确的用户名/密码,则结果显示会话已通过身份验证。
  5. 我注意到有关您的代码的一些事情:

    • 您的代码不会处理响应中的多个Cookie标头。我似乎处理得更好。
    • 您确定所需要的只是JSESSION吗?也许你还缺少其他的cookies?
    • 您是否调试过代码以确保JSESSION Cookie设置正确?我在我的cookie处理代码中添加了一些trim()调用,以确保某些空格没有插入。
    • 我无法看到你secondParameters的真正价值。我不知道它们是否有效。您是否已调试代码以验证secondParamters值是否正常。您可以在我的代码中看到我发布到服务器的内容。顺便说一句,我使用StringBuilder代替+来构建它们。

    希望这有帮助。