Java HttpURLConnection getInputStream读取页面,然后发出POST请求

Java HttpURLConnection getInputStream读取页面,然后发出POST请求,java,post,cookies,httpurlconnection,Java,Post,Cookies,Httpurlconnection,我试图获取页面(HTML),从中读取特殊标记(每次都不同),然后发送POST请求,但这会给我java.lang.IllegalStateException:connect in progress final URL url = new URL("<...>"); String token = null; final HttpURLConnection con = (HttpURLConnection) url.openConnection(); try

我试图获取页面(HTML),从中读取特殊标记(每次都不同),然后发送POST请求,但这会给我
java.lang.IllegalStateException:connect in progress

    final URL url = new URL("<...>");
    String token = null;
    final HttpURLConnection con = (HttpURLConnection) url.openConnection();
    try (final InputStreamReader isr = new InputStreamReader(con.getInputStream())) {
        try (final BufferedReader in = new BufferedReader(isr)) {
            String str;
            while ((str = in.readLine()) != null) {
                if (str.contains("__token")) {
                    token = str.replace("<...>", "").replace("<...>", "");
                    System.out.println(token);
                    break;
                }
            }
            in.close();
        }
        isr.close();
    }
    con.setRequestMethod("POST");
    con.setRequestProperty("User-Agent", USER_AGENT);
    con.setDoOutput(true);
    try (final DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
        final String params = getParams("par1", "par2", token);
        wr.writeBytes(params);
        wr.flush(); wr.close();
        final int responseCode = con.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + params);
        System.out.println("Response Code : " + responseCode);
        try (final BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
            String inputLine;
            final StringBuilder response = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
            System.out.println(response.toString());
        }
    }
最终URL=新URL(“”);
字符串标记=null;
最终的HttpURLConnection con=(HttpURLConnection)url.openConnection();
try(final InputStreamReader isr=new InputStreamReader(con.getInputStream())){
try(final BufferedReader in=new BufferedReader(isr)){
字符串str;
而((str=in.readLine())!=null){
if(str.contains(“\uu标记”)){
标记=str.replace(“,”).replace(“,”);
System.out.println(令牌);
打破
}
}
in.close();
}
isr.close();
}
con.setRequestMethod(“POST”);
con.setRequestProperty(“用户代理”,用户代理);
con.设置输出(真);
try(final DataOutputStream wr=newdataoutputstream(con.getOutputStream())){
最后一个字符串params=getParams(“par1”、“par2”、token);
wr.writeBytes(参数);
wr.flush();wr.close();
final int responseCode=con.getResponseCode();
System.out.println(“\n向URL发送'POST'请求:“+URL”);
System.out.println(“Post参数:“+params”);
System.out.println(“响应代码:“+responseCode”);
try(final BufferedReader in=new BufferedReader(new InputStreamReader(con.getInputStream())){
字符串输入线;
最终StringBuilder响应=新建StringBuilder();
而((inputLine=in.readLine())!=null){
追加(inputLine);
}
in.close();
System.out.println(response.toString());
}
}
如果我尝试从cookie中获取此令牌,也是一样的:

final-String-token=con.getHeaderField(“Set-Cookie”).replace(“\uu-token=”,”).replace(“;path=/;HttpOnly”,”)

如何正确地做到这一点?

上面说:

每个HttpURLConnection实例用于发出单个请求,但 与HTTP服务器的底层网络连接可能是 被其他实例透明地共享

这意味着您不能在同一
HttpURLConnection
对象上创建新的(POST)请求。事实上,您从中获得了一个
非法状态异常

因此,您应该从
con
的定义中删除
final
修饰符,然后在处理完原始(GET)请求的输出后,创建另一个连接:

con = (HttpURLConnection) url.openConnection();
只有这样,您才能继续构建POST请求



注意:您使用try with资源,因此不需要显式关闭流。此外,您不需要两个
try
块。事实上,您不需要保留对
InputStreamReader
的引用,因为
BufferedReader.close()
也会关闭底层
Reader
,这也会关闭底层
InputStream

好的,谢谢,关于注意:我添加该代码是为了确保此错误与开放流无关。