使用jenkins传递字符参数,参数为url时报错--xxx 不是内部或外部命令,也不是可运行的程序(url中包含保留字符)
错误:
问题分析:
1.当直接把1个url当作一个字符串传递时,url中的保留符号(&)会导致程序出错
2.在url中特殊符号都有特殊意义或者被认为是不安全的字符,所以在拼接url时应当做替换处理。
RFC3986文档规定,Url中只允许包含以下四种:
1、英文字母(a-zA-Z)
2、数字(0-9)
3、-_.~ 4个特殊字符
4、所有保留字符,RFC3986中指定了以下字符为保留字符(英文字符): ! * ' ( ) ; : @ & = + $ , / ? # [ ]
Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符。Url编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61。同理,参看如下图ASCII表,#应该被替换处理为%23
解决办法:
把要通过jenkins传递的url先进行url-encode编码,在具体使用到该参数的时候,再进行urldecode解码
#导入依赖包
import urllib.parse
#要通过jenkins传递的url
url ='http://jira.xxxxx.com/secure/RapidBoard.jspa?rapidView=187&projectKey=OFFICIAL&selectedIssue=OFFICIAL-5837'
先编码
#urlencode编码
data = urllib.parse.quote(url)
输出结果:
'http%3A//jira.XXXX.com/secure/RapidBoard.jspa%3FrapidView%3D187%26projectKey%3DOFFICIAL%26selectedIssue%3DOFFICIAL-5837'
解码
finall_url=urllib.parse.unquote(data)
输出结果:
和未编码之前一样就对了
'http://jira.XXX.com/secure/RapidBoard.jspa?rapidView=187&projectKey=OFFICIAL&selectedIssue=OFFICIAL-5837'
再试试用jenkins传递 编码后的url就不会报错了
参考文档