我得到java.lang.IllegalStateException
:
java.lang.IllegalStateException
:在之后调用setRequestProperty
方法时,无法在建立连接后设置请求属性
url.openConnection();
以下是我的尝试:
URL url = new URL("https://49.205.102.182:7070/obsplatform/api/v1/mediadevices/545b801ce37e69cc");
urlConnection = (HttpsURLConnection) url
.openConnection();
urlConnection.setRequestProperty("Content-Type","application/json");
有什么建议吗?提前谢谢。
答案 0 :(得分:34)
如果您在调试监视器中有一些调用,例如conn.getResponseCode()(或者在仍然不完整时执行请求的任何调用),通常会发生这种情况。 这导致,在调试期间,调试器观察器执行请求,然后正确设置您的请求,然后它变为无效。
答案 1 :(得分:4)
我在调试模式下只有这个问题, 没有调试运行(你可以打印日志)一切都应该正常工作
答案 2 :(得分:2)
显而易见的是,您需要在对URL调用open之前添加属性。然而事实并非如此。我已经看到在网址打开后设置的许多设置样本(反直觉)。
我的问题是我在监视列表中添加了conn.getResponseCode()。删除了所有的好处。
......很棘手。
答案 3 :(得分:1)
请检查以下代码
HttpURLConnection httpcon = (HttpURLConnection) ((new URL("a url").openConnection()));
httpcon.setDoOutput(true);
httpcon.setRequestProperty("Content-Type", "application/json");
httpcon.setRequestProperty("Accept", "application/json");
httpcon.setRequestMethod("POST");
httpcon.connect();
答案 4 :(得分:0)
我在setRequestProperty("Range","byte=" + downloadedSize + "-")
上遇到了同样的例外。
添加connection.setChunkedStreamingMode(0);
后,问题就消失了
答案 5 :(得分:0)
我遇到了同样的问题。 我在Nexus 5上观察到了这个问题。我的应用程序的代码经常失败并出现相同的异常(或者它的双胞胎兄弟“无法设置请求方法......”)
我观察到如果我离开手机一段时间会发生这种情况。一个它开始失败它一直失败 - 但如果我重新启动手机/模拟器它再次没问题。
我的怀疑是它在框架端的连接池中的某些错误,或者代码资源中的某个地方都被泄露了。
答案 6 :(得分:0)
我发现问题在于代码的顺序,如果您试图同时添加标头和后缀参数,请务必谨慎
HttpURLConnection connection = (HttpURLConnection) urlConnection;
//// Add Request Headers
for (NameValuePair nvp :
request[0].getHeaderParams()) {
connection.setRequestProperty(nvp.getName(),nvp.getValue());
}
// done
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
//// Add Post Parameters
OutputStream outputStream = urlConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
List<NameValuePair> params = new ArrayList<>(request[0].getPostParams());
bufferedWriter.write(getQuery(params));
// done
connection.setConnectTimeout(3000);
connection.setReadTimeout(3000);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.flush();
outputStream.close();
connection.connect();
在这里,我添加了标头参数,然后设置了setDoInput
和setDoOutput
然后是setRequestMethod
,最后您可以添加POST参数。
我不知道setRequestMethod
出了什么问题,但是我认为它通过打开连接或其他方式来准备连接,这就是为什么它会引发异常
答案 7 :(得分:0)
在将字节写入OutputStream之后不调用setRequestProperty。
OutputStream os = connection.getOutputStream();
os.write("k=v".getBytes());
os.close();
您应在代码上方调用setRequestProperty
答案 8 :(得分:0)
为避免错误:
java.lang.IllegalStateException:建立连接后无法设置请求属性
在访问请求标头字段之前,我们必须检查连接响应:
URL url = new URL("https://49.205.102.182:7070/obsplatform/api/v1/mediadevices/545b801ce37e69cc");
urlConnection = (HttpsURLConnection) url
.openConnection();
//Check connection
if(urlConnection.getResponseCode() == 200/*Successful*/) {
urlConnection.setRequestProperty("Content-Type","application/json");
...
...
}