Groovy脚本中通过bash执行curl时&符号转义失效导致请求参数异常的问题
解决Groovy中执行curl命令时&参数被忽略的问题
这个问题的核心是bash对URL中&符号的解析冲突,以及你之前用的HTML转义符&完全不被bash和服务端认可,导致at参数根本没被正确传递。下面给你两个可靠的解决方案:
方案一:用单引号包裹URL,避免bash解析特殊字符
bash会把未转义的&当作“后台执行命令”的分隔符,所以我们可以把整个URL用单引号括起来,让bash把它当作一个完整的参数。在Groovy里用单引号多行字符串(''')来定义命令,避免Groovy的字符串转义干扰:
descr = ''' curl --silent -k -u test:test 'https://bitbucket/rest/api/1.0/projects/test/repos/test/pull-requests?state=all&at=refs/heads/release/test' | /usr/bin/core_perl/json_pp ''' def descrtxt = ['bash', '-c', descr].execute() descrtxt.waitFor() // 可以打印输出和错误信息调试 println descrtxt.text println descrtxt.err.text
方案二:在Groovy字符串中正确转义&
如果你习惯用双引号多行字符串,需要在&前面加两个反斜杠(\\&)——第一个反斜杠是Groovy用来转义第二个反斜杠的,这样bash最终收到的命令里会是单个\&,从而把&当作URL的一部分:
descr = """ curl --silent -k -u test:test "https://bitbucket/rest/api/1.0/projects/test/repos/test/pull-requests?state=all\\&at=refs/heads/release/test" | /usr/bin/core_perl/json_pp """ def descrtxt = ['bash', '-c', descr].execute() descrtxt.waitFor()
为什么之前的方法无效?
你用的&是HTML的转义字符,bash和Bitbucket的API都不认识它——服务端收到的参数会是state=all&at=...,相当于把&at当成了一个无效参数名,自然不会过滤指定分支的PR,所以返回了所有状态的结果。
内容的提问来源于stack exchange,提问作者stevemayster
相关产品推荐
相关产品推荐

