[英]Unable to execute CURL command through java Runtime.getRuntime().exec()
I am executing a curl command using java. 我正在使用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"
I want to get the output of this curl command in my code,but my stdoutput is coming out to be empty. 我想在我的代码中获取此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();
}
Tried executing the curl command manually, its working fine. 尝试手动执行curl命令,其工作正常。 Then I printed the standard error, and I can 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 curl command is executed manually, its working fine then why not through Runtime.getRuntime() ? 当手动执行curl命令时,它的工作正常,那么为什么不通过Runtime.getRuntime()?
Kindly suggest!! 请建议!! Any help will be appreciated.
任何帮助将不胜感激。
It seems like the data shell/console is interpreting/changing characters. 看起来数据shell /控制台正在解释/更改字符。 For example the following line:
例如以下行:
-H "Content-Type: application/json"
... seems to be getting interpreted as three different arguments: ......似乎被解释为三个不同的论点:
-H Content-Type:
and application
and /json
by the shell/console. -H Content-Type:
和shell / console的application
和/json
。
Try breaking the command string down into an array of components using the format: 尝试使用以下格式将命令字符串分解为组件数组:
exec(String[] cmdarray)
That way it will be clear to the shell/console which arguments are grouped together. 这样,shell / console将清楚哪些参数组合在一起。
Here is a test in groovy that proves the point: 这是一个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'] == ''
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.