【问题标题】:Multiple Http requests and responses using HttpURLConnection使用 HttpURLConnection 的多个 Http 请求和响应
【发布时间】:2011-12-08 18:13:09
【问题描述】:

我正在开发一个非常简单的 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)?

提前致谢

【问题讨论】:

    标签: java http httpurlconnection bots


    【解决方案1】:

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

    我注意到关于您的代码的几件事:

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我还有一个问题。我你看到你发布到服务器的内容了吗?例如,我可以使用 fiddler 或 firebug 来查看浏览器和服务器之间的流量。你用什么来查看你的 java 程序正在发送什么?
    • 我没有一个好的答案@tt0686。我也会使用 firebug 或者代理服务器。我没有看到任何使用HttpURLConnection 的简单方法。
    • 这可能对其他人有用,也许,被剪断的代码托管在临时站点上,该站点已消失,使此答案完全无用。
    最近更新 更多