12

I am getting java.lang.IllegalStateException:

java.lang.IllegalStateException: Cannot set request property after connection is made error when setRequestProperty method is called after url.openConnection();

Here is what i am trying:

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");

any suggestions please? Thanks in advance.

Raghunandan
  • 129,147
  • 24
  • 216
  • 249
siva
  • 373
  • 1
  • 2
  • 9

9 Answers9

44

This usually happens if you have in the debug watchers calls, such as conn.getResponseCode() or anything that queries the request result before the request was actually issued or completed. This causes, that during debug, a request is performed by the watcher, before having properly set you request, and then it becomes invalid.

Pablo Retyk
  • 5,432
  • 6
  • 39
  • 59
5

I only have this issue while in debugging mode, Run without debugging (You can print logs) everything should work fine

kyildizoglu
  • 97
  • 2
  • 7
2

The obvious thing is to think that you need to add properties before calling open on the URL. this however is not the case. i have seen many samples of settings being set AFTER url has been open (as counter intuitive as that is).

the problem in my case is that i had conn.getResponseCode() added in my watch list. removed that and all good.

... tricky.

Squibly
  • 134
  • 1
  • 5
1

please check below code

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();
Kanaiya Katarmal
  • 5,475
  • 4
  • 27
  • 52
  • Thanks for response, i tried but getting similar error java.lang.IllegalStateException: Already connected. – siva Mar 11 '14 at 11:39
  • same question on stackoverflow see this http://stackoverflow.com/questions/7726195/setresponsecode-method-giving-java-lang-illegalstateexception-cannot-set-method – Amarnath Baitha Mar 11 '14 at 12:46
0

I was getting the same exception on setRequestProperty("Range","byte=" + downloadedSize + "-") . After adding connection.setChunkedStreamingMode(0); the issue disappeared

mdavid
  • 503
  • 5
  • 16
0

I'm having the same issue. I was observing this issue on Nexus 5. Code of my app constantly fails with the same exception (or its twin brother "cannot set request method ..")

What I've observed that it happens if i leave phone for a while. One it starts failing it fails all the time - but if i restart phone/emulator it's ok once again).

My suspicion is its either some bug in connection pooling on framework side, or somewhere in code resources are leaked.

Daber
  • 542
  • 5
  • 13
0

i found the problem it's about ordering the code, if you are trying to add header and post parameters both, it's important to be careful about this

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

in here, i have added header parameters then set setDoInput and setDoOutput then setRequestMethod and finally you can add POST parameters. i don't know what is wrong with setRequestMethod but i think its preparing the connection by opening it or something and that's why it throws exception

Ebrahim Karimi
  • 543
  • 6
  • 19
0

not invoke setRequestProperty after write byte to OutputStream.

OutputStream os = connection.getOutputStream();
os.write("k=v".getBytes());
os.close();

you should invoke setRequestProperty above the code

jinzuchi
  • 29
  • 5
0

To avoid the error:

java.lang.IllegalStateException: Cannot set request property after connection is made

We have to check the connection response before access the request header fields :

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");
  ...
  ...    
 }
Jorgesys
  • 114,263
  • 22
  • 306
  • 247