使用groovy为cURL创建命令行字符串 - cURL忽略选项

时间:2016-05-10 12:37:19

标签: rest curl groovy

我需要帮助找出为什么忽略我的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命令会按预期返回一个非常长的令牌。

安迪的想法?

2 个答案:

答案 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
}