在groovy脚本中执行时,完美工作的curl命令失败

在groovy脚本中执行时,完美工作的curl命令失败,curl,groovy,gitblit,Curl,Groovy,Gitblit,我在gitblit中有一个post-commit钩子(groovy脚本)来调用REST端点。在这个脚本中,我执行一个curl命令。但它似乎失败了。从命令行执行curl命令时,效果良好 下面是我的groovy脚本 #!/usr/bin/env groovy def repoUrl= "https://gitblit.myhost.com/git/" + repository + ".git" json='{"repository":{"url":"'+repoUrl+'"}}' def re

我在gitblit中有一个post-commit钩子(groovy脚本)来调用REST端点。在这个脚本中,我执行一个curl命令。但它似乎失败了。从命令行执行curl命令时,效果良好

下面是我的groovy脚本

#!/usr/bin/env groovy


def repoUrl= "https://gitblit.myhost.com/git/" + repository + ".git"
json='{"repository":{"url":"'+repoUrl+'"}}'

def response = "curl -v -k -X POST -H \"Content-Type: application/json\" -d '${json}' https://username:password@anotherhost.com:9443/restendpoint".execute().text
println response 
gitblit将存储库传递给这个脚本,我已经对它进行了验证


有人能帮我解决这个问题吗。

我无法用你的例子重现你的问题,但我将尝试一个大胆的猜测:

首先,使用list
execute()
version,这样就不会出现令牌问题:

process = [ 'bash', '-c', "curl -v -k -X POST -H \"Content-Type: application/json\" -d '${json}' https://username:password@anotherhost.com:9443/restendpoint" ].execute()
其次,读取流程中的错误和输出:

process.waitFor()
println process.err.text
println process.text

err
可能会给出正在发生的情况,以避免“永远运行”进程(在某些Windows环境中,当输出超过4096字节时会发生这种情况)将初始大小添加到ByteArrayOutputStream

def initialSize = 4096
def out = new ByteArrayOutputStream(initialSize)
def err = new ByteArrayOutputStream(initialSize)
def proc = command.execute()
proc.consumeProcessOutput(out, err)
proc.waitFor()

我可以通过在数组中传递curl命令中的所有字符串来实现这一点。下面是我是怎么做的

def response = ["curl", "-k", "-X", "POST", "-H", "Content-Type: application/json", "-d", "${json}", "https://username:password@myhost.com:9443/restendpoint"].execute().text
在Curl Post中--In-F选项-用双引号将整个参数包装起来。不要忘记转义双引号以获得正确的语法。 示例如下:


def response=“curl-u admin:admin-F\”jcr:content/par/address/address1=2/3 Market Place\”.execute().text

您能否在执行GString之前打印出GString以确保它生成您期望的命令?具体失败的原因是什么?你能不能把你的问题说得更准确些?很难看出这是如何真正回答这里提出的问题的…@AndrewBarber不这样做可能会导致挂起程序。询问者没有说明命令是如何失败的,所以这是一个公平的猜测,我们一直在猜测。谢谢。我搜索了几个小时,但你的解决方案对我有效。为什么必须使用列表版本而不是常规字符串?@Jamil,我想这是因为运行时执行可以正确地分离参数/命令和转义,否则可能会产生歧义。如果有人好奇,这里有一个关于分隔参数的简要说明:。我认为第一个代码块中的
.text
是错误的,不是吗?我们如何从groovy execute方法检索HTTP代码?