setRequestProperty抛出java.lang.IllegalStateException:连接后无法设置request属性

时间:2014-03-11 08:42:32

标签: android

我得到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");

有什么建议吗?提前谢谢。

9 个答案:

答案 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();

在这里,我添加了标头参数,然后设置了setDoInputsetDoOutput然后是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");
  ...
  ...    
 }