无法通过java Runtime.getRuntime().exec()执行CURL命令

无法通过java Runtime.getRuntime().exec()执行CURL命令,java,curl,Java,Curl,我正在使用java执行一个curl命令 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-ID

我正在使用java执行一个curl命令

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"
我想在代码中获得这个curl命令的输出,但是我的stdoutput结果是空的

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

    }
尝试手动执行curl命令,工作正常。 然后我打印了标准误差,我可以看到:

   [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
当手动执行curl命令时,其工作正常,那么为什么不通过Runtime.getRuntime()执行呢


请建议!!任何帮助都将不胜感激。

看起来数据外壳/控制台正在解释/更改字符。例如,以下行:

-H“内容类型:应用程序/json”

。。。似乎被解释为三个不同的论点:

-H内容类型:
应用程序
/json
,由shell/控制台执行

尝试使用以下格式将命令字符串分解为组件数组:

exec(String[]cmdarray)

这样,shell/控制台就会清楚哪些参数被分组在一起

下面是groovy中的一个测试,它证明了这一点:

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'] == ''

我是这样构建我的命令的:String cmd=“curl-I--user\”“+appId+”:“+appIdPwd+”\“-H\”内容类型:application/json\“-H\”Accept:application/json\+”-H'X-user-IDENTITY-DOMAIN-NAME:“+tenantName+”-H\”X-RESOURCE-IDENTITY-DOMAIN-NAME:“+tenantName+”--request GET\”“+url.substring(0,url.lastIndexOf(“/”)+”/oam/services/rest/11.1.2.0.0/oauth/admin/Clients?name=“+client+”\”";为什么要执行外部
curl
过程?您可以在
java
中轻松地直接发送和处理任何http请求。这样会更有效率!参见示例:
https
请求的另一个示例如下:非常感谢Chris。我尝试将curl命令分解成一个数组,结果成功了。谢谢@Sammi你能提供有效的代码吗。我也有类似的问题。