android - HttpsURLConnection 中的 "Connection already established"异常

标签 android httpsurlconnection

我正在尝试使用 HttpsURLConnection 执行 POST 请求,并获取

java.net.ProtocolException: Connection already established

关于 setRequestMethod 奇怪的是,conn.connected 之前返回 false

我错过了什么?

URL url = new URL("https://ws.audioscrobbler.com/2.0/");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
// here conn.connected is false
conn.setRequestMethod("POST"); // here I get java.net.ProtocolException: Connection already established
conn.setDoInput(true);

编辑

我试过 DefaultHttpClient 并且它有效,所以我将改用它。

最佳答案

对于遇到此问题的任何其他人,我遇到了一个操作顺序问题,该问题仅在我执行请求正文中包含内容的 HTTP POST 时才会影响到我。在 HttpURLConnection 实际发起与服务器的连接时,在所有情况下都不是完全清楚。

我最初的请求是这样的:

        HttpURLConnection conn = null;
        try
        {
            conn = (HttpURLConnection) baseUrl.openConnection();  
            conn.setConnectTimeout(connectTimeoutMillis);
            conn.setReadTimeout(requestTimeoutMillis);

            //required for reading a response body
            conn.setDoInput(true);

            //Not all request types have a body (e.g. GET usually doesn't)
            if(requestBody != null && requestBody.length > 0)
            {
                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(requestBody.length);
                conn.getOutputStream().write(requestBody);
                conn.getOutputStream().flush();
                conn.getOutputStream().close();
            }

            try
            {
                conn.setRequestMethod(verb.toUpperCase());
            }
            catch (final ProtocolException e)
            {
                response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
                Log.e(TAG, response.errorMessage, e);
                return response;
            }

事实证明,在调用“conn.getOutputStream()”之后,您不能再调用“conn.setRequestMethod(...)”,所以在我的例子中,简单的解决方法是调用“conn.setRequestMethod(. ..)”在处理写入请求正文之前。工作代码是:

HttpURLConnection conn = null;
        try
        {
            conn = (HttpURLConnection) baseUrl.openConnection();  
            conn.setConnectTimeout(connectTimeoutMillis);
            conn.setReadTimeout(requestTimeoutMillis);

            //required for reading a response body
            conn.setDoInput(true);

            try
            {
                conn.setRequestMethod(verb.toUpperCase());
            }
            catch (final ProtocolException e)
            {
                response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
                Log.e(TAG, response.errorMessage, e);
                return response;
            }

            //Not all request types have a body (e.g. GET usually doesn't)
            if(requestBody != null && requestBody.length > 0)
            {
                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(requestBody.length);
                conn.getOutputStream().write(requestBody);
                conn.getOutputStream().flush();
                conn.getOutputStream().close();
            }

唯一真正的变化只是切换了调用的顺序,从而消除了异常。希望这能为遇到此问题的任何其他人解决此问题。

关于android - HttpsURLConnection 中的 "Connection already established"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17984368/

相关文章:

android - 在 Android 中使用 TLS 并禁用 SSL

java - 从java中的https-URL读取

java - 服务器响应是 : Bad Request: 400 in httpurlconnection

Android finalize() 和 System.exit()|System.gc()

android - react native : set different variable in iOS/Android builds

java - 在android广播接收器中创建数据库的代码

android - 由于某些 ssl 证书问题,媒体使用签名的 url interup 上传到云?

java - Appium sendKeys 在 android 上真的很慢

java - 有没有办法通过使用 FirestoreRecyclerAdapter 组合查询游标来对查询进行分页?

android - 将自签名证书加载到 HttpsUrlConnection 会破坏默认的 CA 证书验证