jenkins 通过请求发布作业 xml 失败并出现异常
jenkins posting job xml via requests fails with exception
我已经python将文件写入磁盘以进行故障排除
Caused by: com.thoughtworks.xstream.io.StreamException: : only whitespace content allowed before start tag and not - (position: START_DOCUMENT seen -... @1:1)
代码:
timeout = 3
headers = {'content-type': 'text/xml'}
configFile = {'file': open(os.environ['NEWJOBXML'], 'rb').read()}
newjobxml = requests.post("http://" + os.environ['USER'] + ":" + os.environ['API_TOKEN'] + "@" + os.environ['JR_URL'] + "/createItem?name=" + newjob, files=configFile, headers=headers, timeout=int(timeout))
我也为 header 得到这个:
{'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Authorization': 'Basic ********************************************************',
'Connection': 'keep-alive',
'Content-Length': '11629',
'User-Agent': 'python-requests/2.5.1 CPython/2.7.5 Darwin/13.3.0',
'content-type': 'text/xml'}
当我通过 curl post 相同 xml 时,没有错误
curl -H "Content-type: text/xml" -X POST http://USER:API_TOKEN@JR_URL/createItem?name=newjob --data-binary @/tmp/.config.xml
我正在尝试将我的代码从 bash 迁移到 python。
使用 requests.post(url, data=f.read(), ...)
而不是 files
关键字参数。
使用 requests.post(files=files)
会将您的文件上传为多部分编码数据(请参阅 requests
docs)-这就是您想要以 HTML 形式上传文件的方式,但这不是您所需要的。
curl --data-binary @filename
将文件的原始未编码内容作为 POST
正文发送。这样的请求将如下所示:
POST / HTTP/1.1
Host: localhost
Content-type: text/xml
Content-Length: 4
FOO
(其中FOO
是请求正文/文件内容)。
您对多部分编码数据的请求目前看起来像这样:
POST / HTTP/1.1
Host: localhost
Content-type: text/xml
Content-Length: 144
--c225e276f4d4486fabe5770cd4f72a11
Content-Disposition: form-data; name="file"; filename="file"
FOO
--c225e276f4d4486fabe5770cd4f72a11--
所以相当于 curl
的 --data-binary
用于 requests
库是简单地在 data
关键字参数中传递原始数据:
data = open('foo.xml', 'rb').read()
newjobxml = requests.post(url, data=data, headers=headers, timeout=int(timeout))
顺便说一句:您可能想看看 autojenkins
Python 模块。
我已经python将文件写入磁盘以进行故障排除
Caused by: com.thoughtworks.xstream.io.StreamException: : only whitespace content allowed before start tag and not - (position: START_DOCUMENT seen -... @1:1)
代码:
timeout = 3
headers = {'content-type': 'text/xml'}
configFile = {'file': open(os.environ['NEWJOBXML'], 'rb').read()}
newjobxml = requests.post("http://" + os.environ['USER'] + ":" + os.environ['API_TOKEN'] + "@" + os.environ['JR_URL'] + "/createItem?name=" + newjob, files=configFile, headers=headers, timeout=int(timeout))
我也为 header 得到这个:
{'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Authorization': 'Basic ********************************************************',
'Connection': 'keep-alive',
'Content-Length': '11629',
'User-Agent': 'python-requests/2.5.1 CPython/2.7.5 Darwin/13.3.0',
'content-type': 'text/xml'}
当我通过 curl post 相同 xml 时,没有错误
curl -H "Content-type: text/xml" -X POST http://USER:API_TOKEN@JR_URL/createItem?name=newjob --data-binary @/tmp/.config.xml
我正在尝试将我的代码从 bash 迁移到 python。
使用 requests.post(url, data=f.read(), ...)
而不是 files
关键字参数。
使用 requests.post(files=files)
会将您的文件上传为多部分编码数据(请参阅 requests
docs)-这就是您想要以 HTML 形式上传文件的方式,但这不是您所需要的。
curl --data-binary @filename
将文件的原始未编码内容作为 POST
正文发送。这样的请求将如下所示:
POST / HTTP/1.1
Host: localhost
Content-type: text/xml
Content-Length: 4
FOO
(其中FOO
是请求正文/文件内容)。
您对多部分编码数据的请求目前看起来像这样:
POST / HTTP/1.1
Host: localhost
Content-type: text/xml
Content-Length: 144
--c225e276f4d4486fabe5770cd4f72a11
Content-Disposition: form-data; name="file"; filename="file"
FOO
--c225e276f4d4486fabe5770cd4f72a11--
所以相当于 curl
的 --data-binary
用于 requests
库是简单地在 data
关键字参数中传递原始数据:
data = open('foo.xml', 'rb').read()
newjobxml = requests.post(url, data=data, headers=headers, timeout=int(timeout))
顺便说一句:您可能想看看 autojenkins
Python 模块。