使用ProcessBuilder从Java执行curl命令

4

我将编写一个Java测试程序来测试我的与Django(特别是djangorestframework)的restful api的连接。其中一个选项是使用curl测试api之一。从shell中运行curl命令,它可以正常工作,例如:

curl --show-error --request GET --header 'Accept: application/json' --user "user:pwd" http://127.0.0.1:8000/api/v1/

这将以JSON格式返回API根URL和帮助文本。

现在,当我尝试使用ProcessBuilder从Java调用相同的内容时,我得到了以下答案:

{"detail": "You do not have permission to access this resource. You may need to login or otherwise authenticate the request."}

我正在使用的Java代码是:

ProcessBuilder p=new ProcessBuilder("curl","--show-error", "--request","GET",
                    "--header","'Accept: application/json'", "--user","\"" + userName + ":" + password + "\"", getApiRootUrlString());
final Process shell = p.start();

因为我还通过以下方式捕获错误流:

InputStream errorStream= shell.getErrorStream();
InputStream shellIn = shell.getInputStream();

我知道他启动了curl命令,因为在其中一个选项中犯了错误,会显示curl帮助文本。

我不确定调用它的区别,但很确定是相同的命令。

顺便说一下,“getApiRootUrlString()”返回正确的URL:http://127.0.0.1:8000/api/v1/

1个回答

5

你传递给ProcessBuilder构造函数的每个字符串代表一个参数,因此你不需要使用 shell 中必须使用的引号。请尝试以下操作:

ProcessBuilder p=new ProcessBuilder("curl","--show-error", "--request","GET",
                "--header","Accept: application/json", "--user", userName + ":" + password, getApiRootUrlString());

如果您使用引号,那么它们将成为传递给进程的值的一部分,因此您尝试使用用户名为"user和密码为pwd"进行身份验证。

啊,我真是太蠢了,当然!谢谢!我刚刚测试过了,的确如此......(在测试之前我已经知道你是对的) - michel.iamit
@Ian Roberts 如果参数中有空格,例如 Authorization:Bearer ehfh... 会怎么样? https://dev59.com/FqokpogBymzxlkE8m3wP - Shabar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接