CURL command failed through java Runtime.getRuntime (). Exec ()

I am executing a curl command using java.

curl -i --user "OAMADMIN_tenant_358922247351079_svc_358922247369079_APPID:Iuj.2swilg5fhv" -H "Content-Type: application/json" -H "Accept: application/json" -H 'X-USER-IDENTITY-DOMAIN-NAME: tenant_358922247351079' -H "X-RESOURCE-IDENTITY-DOMAIN-NAME: tenant_358922247351079" --request GET "https://slc04yre-1.dev.oraclecorp.com:4443/oam/services/rest/11.1.2.0.0/oauth/admin/Clients?name=myMCS_svc_358922247369079_MCS_Client_OAUTHCLIENT" 

I want to get the output of this curl command in my code, but my stdoutput comes out empty.

  private static String executeCommand(String command) { StringBuffer output = new StringBuffer(); Process p; try { p = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader( p.getInputStream())); //p.waitFor(); String line = ""; while ((line = reader.readLine()) != null) { System.out.println("line="+line); output.append(line + "\n"); } } catch (Exception e) { e.printStackTrace(); } return output.toString(); } 

I tried to execute the curl command manually, its operability. Then I printed a standard error and I see:

  [testng] error line= [testng] error line=curl: (6) Couldn't resolve host 'application' [testng] error line= [testng] error line=curl: (6) Couldn't resolve host 'application' [testng] error line= [testng] error line=curl: (6) Couldn't resolve host 'tenant_359516638431079'' [testng] error line= [testng] error line=curl: (6) Couldn't resolve host 'tenant_359516638431079"' [testng] error line= [testng] error line=curl: (1) Unsupported protocol: "https 

When the curl command is executed manually, it works fine, why not run Runtime.getRuntime ()?

Pls offer !! Any help would be appreciated.

+5
source share
1 answer

It seems that the shell / data console interprets / changes characters. For example, the following line:

-H "Content-Type: application/json"

... seems to be interpreted as three different arguments:

-H Content-Type: and application and /json using the shell / console.

Try breaking the command line into an array of components using the format:

exec(String[] cmdarray)

Thus, it will be clear that the shell / console with which the arguments are grouped,

Here is a groovy test that proves the point:

 def Object executeCommand(command) { def proc = Runtime.getRuntime().exec(command); def sout = new StringBuffer() def serr = new StringBuffer() proc.consumeProcessOutput(sout, serr) proc.waitFor() return [ 'sout':sout.toString(), 'serr':serr.toString() ] } response = executeCommand('''curl --silent --show-error -H "Accept: application/json" --request GET "https://education.cloudant.com/"''') assert response['sout'] == '' assert response['serr'].startsWith( 'curl: (6) Could not resolve host: application' ) response = executeCommand(['curl', '--silent', '--show-error', '-H', 'Accept: application/json', '--request', 'GET', 'https://education.cloudant.com/'] as String[] ) assert response['sout'].startsWith('{"couchdb":"Welcome","version":"1.0.2","cloudant_build":"2367"}') assert response['serr'] == '' 
+3
source

All Articles