我需要帮助找出为什么忽略我的cURL查询的最后两个参数。
请不要评论这不是休息电话的最佳方式。我知道。对于另一个问题,这将是一种后退方法/解决方法。 我manyl使用wslite(1.1.2)API处理我的休息工作。
现在让我解释一下我的所作所为: 我正在使用groovy shell执行程序通过cURL对休息服务进行命令行调用。
我构建了一个小类来构建查询字符串并处理命令行:
class Curl {
def static getUserLogin(){
def url = '"https://some-login.someSystem-dev.someHost.com/someResource.beyond.foobar/login/LoginAUser '
def requestFilePath = '-d @temp/LoginPayload.json '
def heads = "-H 'Content-Type: application/json' -H 'Accept: text/plain' "
def params = '-k -v' //-k = ignore unsecure -v = more verbose output
def fullurl = url+requestFilePath+heads+params
return ex(fullurl)
}
/**
*
* @param _command The command you want to execute on your shell.
* @param _workingDir Optional: You may specify the directory where the command will be executed. Default is user dir.
* @return Exit value for the process. 0 = normal termination.
*/
def static ex(String _command, File _workingDir = new File(System.properties.'user.dir')) {
println "Executing command> $_command \n"
def process = new ProcessBuilder(addShellPrefix(_command))
.directory(_workingDir)
.redirectErrorStream(true)
.start()
process.inputStream.eachLine {println it}
process.waitFor();
return process.exitValue().value
}
private static addShellPrefix(String _command) {
def commandArray = new String[2]
commandArray[0] = "curl "
commandArray[1] = _command
return commandArray
}
}
Curl.getUserLogin() //to execute
我希望代码足够自我解释。这一切都适用于简单的URL和较少的参数。
执行此操作将产生以下响应(摘自完整的调试输出):
执行命令> “https://some-login.someSystem-dev.someHost.com/someResource.beyond.foobar/login/LoginAUser” -d @ temp / LoginPayload.json -H'Content-Type:application / json'-H'Eccept:text / plain'-k -v
%收到的总百分比%Xferd平均速度时间时间 当前 Dload上载总左转速度
0 0 0 0 0 0 0 0 - : - : - - : - : - - : - : - 0 0 0 0 0 0 0 0 0 - : - : - - : - : - - : - : - 0 curl:(60)SSL证书问题:证书链中的自签名证书更多详细信息: http://curl.haxx.se/docs/sslcerts.html
curl默认使用a执行SSL证书验证 证书颁发机构(CA)公钥(CA证书)的“捆绑”。如果 默认捆绑文件不够用,您可以指定备用文件 使用--cacert选项。如果此HTTPS服务器使用证书 由证书中包含的CA签名 验证可能因证书问题而失败 (它可能已过期,或者名称可能与域名不匹配 URL)。如果你想关闭curl的验证 证书,使用-k(或--insecure)选项。
现在,正如您所看到的,我已将所需选项“-k”附加到查询字符串,但不知何故它被忽略。直接在Windows命令行工具中使用此字符串(如果您尝试这一点,请确保您避免潜在的双引号)但工作完全正常。
为什么会发生这种情况或者如何获得更多调试信息?
提前thx!更新:
解决方案:
将ever选项作为单个参数传递(通过列表)修复了问题。
新发行: 之后,我想使用curl将“-o C:\ Temp \ response.txt”的响应输出到参数列表中。从命令行工具使用时,这可以正常工作。从groovy脚本执行它会导致:
curl:(23)写身体失败(0!= 386)
我可以通过将流写入文件来解决这个问题。真正令我烦恼的是这样的事实,即回应似乎并未包含正文中的任何信息。从Windows命令行工具执行curl命令会按预期返回一个非常长的令牌。
安迪的想法?答案 0 :(得分:1)
如果使用ProcessBuilder
,则必须将每个参数作为自己的参数。你给构造函数提供了两个参数,程序名和剩下的参数作为一个参数,就像在命令行中对整个字符串放置引号一样。使fullurl
成为一个列表,而每个参数都是自己的列表元素,它应该按预期工作。您可以而且应该忽略任何其他类似于网址的引用。
答案 1 :(得分:1)
您的代码可以大大改进。您不应该将命令部分连接成单个String,只需使用List。
此外,变量上的_
前缀通常用于私有字段或内部,而不是明显不是内部的方法参数。
在Groovy中使用String数组很奇怪,你一定要学习一些Groovy!
无论如何,这是这段代码的更好版本:
def static getUserLogin() {
def url = '"https://some-login.someSystem-dev.someHost.com/someResource.beyond.foobar/login/LoginAUser'
def requestFilePath = '-d @temp/LoginPayload.json'
def heads = "-H 'Content-Type: application/json' -H 'Accept: text/plain' "
def insecure = '-k'
def verbose = '-v'
return ex( [ url, requestFilePath, heads, insecure, verbose ] )
}
/**
*
* @param commands The command + args you want to execute on your shell.
* @param _workingDir Optional: You may specify the directory where the command will be executed. Default is user dir.
* @return Exit value for the process. 0 = normal termination.
*/
static ex( List<String> commands, File _workingDir = new File( System.properties.'user.dir' ) ) {
println "Executing command> $commands \n"
def process = new ProcessBuilder( addShellPrefix( commands ) )
.directory( _workingDir )
.inheritIO()
.start()
process.waitFor()
return process.exitValue().value
}
private static addShellPrefix( List<String> commands ) {
[ 'curl' ] + commands
}