Android &引用;“已建立连接”;HttpsURLConnection中的异常
我正在尝试使用Android &引用;“已建立连接”;HttpsURLConnection中的异常,android,httpsurlconnection,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 = (HttpsURLConn
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,它可以工作,所以我会用它来代替。我尝试了
DefaultHttpClient,它可以工作,所以我会用它来代替。对于遇到这个问题的任何其他人,我有一个操作顺序问题,只有在我写一篇请求正文中有内容的HTTP文章时,它才影响到我。并非所有情况下都完全清楚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();
}
唯一真正的改变就是改变调用的顺序,这样就消除了异常。希望这能为其他有这个问题的人解决这个问题。在Java中工作。什么是连接的
?你确定这就是所有的密码吗?。还有更多代码,但在返回异常的行之后。当它是HttpURLConnection
(非https)时,此功能可以工作,并且使用DefaultHttpClient
使用https。您能解释一下如何使用conn.connected
?据我所知,当您执行url.openConnection()
时,您已经建立了连接。请注意,url.openConnection()
返回的是URLConnection
,而不是HttpsURLConnection
。我在conn.setRequestMethod(“POST”)上设置了一个断点
并检查conn的成员。@haike00 No。TCP连接是在您第一次调用getOutputStream(),
getInputStream(),
或getResponseCode(),
中的一个时建立的,除非它是一个已建立的池连接。如何在没有->conn.setRequestMethod(“post/get”)的情况下分配post get@deliver不是这行conn.setRequestMethod(verb.toUpperCase())的意思吗代码>正在做什么?如果你把“setRequestMethod”写为:连接已经打开,应用程序崩溃@交付您确定没有使用错误的第一个示例而不是正确的第二个示例吗?如果您对OutputStream对象做了任何操作,即使只是调用getOutputStream()
,设置请求方法也为时已晚。