5

I'm getting the java.lang.IllegalStateException: Already connected exception while trying to run to execute a HTTPS GET request with HttpsURLConnection API.

Please find below the code:

HttpsURLConnection con = null;

    try {
        URL obj = new URL(url);
        con = (HttpsURLConnection) obj.openConnection();

        con.setRequestMethod("GET");
        con.setRequestProperty("Authorization", header);
        con.setRequestProperty ("Content-Type", "application/x-www-form-urlencoded");
        String urlParameters = "schema=1.0&form=json&byBillingAccountId={EQUALS,cesar@abc.org}";

        con.setDoOutput(true);

        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        int responseCode = con.getResponseCode();

        System.out.println("Response Code = " + responseCode);

        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        con.disconnect();
        //print result
        System.out.println("Response = " + response.toString());


    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(con!=null) con.disconnect();
    }

Not sure why I'm getting that.

Any idea how to resolve this?

Stack Trace

java.lang.IllegalStateException: Already connected
at java.net.URLConnection.setDoOutput(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.setDoOutput(Unknown Source)
at com.comcast.ccp.xbo.testing.partnerdevices.AppTest.testReadProperties(AppTest.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:200)
at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:155)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:212)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:707)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Adi
  • 2,364
  • 1
  • 17
  • 23
user1356042
  • 395
  • 2
  • 6
  • 23

1 Answers1

3

According to this question setDoOutput is used for PUT and POST requests (they contain a request-entity-body). So there is a conflict with your manually set request method GET.

You are using GET so the url-parameters should be set like in this question and you may just remove setDoOutput.

Also Content-Type does not make sense with GET-requests (source)

Community
  • 1
  • 1
DaniEll
  • 1,022
  • 4
  • 22
  • 31
  • Thanks ...this resolves the issue. This introduces another issue to resolve and that's to set an Authentication header to this httpsconnection. con.setRequestProperty("Authorization", header) doesn't seem to set the header. Any idea? – user1356042 Sep 05 '14 at 16:45
  • Maybe removing the wrong/not needed Content-Type header helps? – DaniEll Sep 05 '14 at 17:09
  • removed that but server returns 401 that means there's a authentication problem and header is not set. – user1356042 Sep 05 '14 at 17:34
  • It could also mean wrong credentials. I guess you are using Basic-Authentication and have to Base64-encode username:password. I would recommend googling. If the problem stays post a new question with your current code (as short as possible)... – DaniEll Sep 05 '14 at 17:42
  • I have a post under http://stackoverflow.com/questions/25687405/need-to-send-https-get-request-with-oauth – user1356042 Sep 05 '14 at 17:48