java 使用HttpURLConnection的多个Http请求和响应

8ftvxx2r  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(203)

我正在开发一个非常简单的http bot。我使用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();

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

3htmauhk

3htmauhk1#

我从来没有用过HttpURLConnection,我一般用Apache's HTTPClient code,他们的主页上有很多关于它的文档和教程。
关于你的代码我注意到了几件事:

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

希望这能帮上忙。

相关问题