jenkins通过请求发布作业xml失败,但有异常

时间:2015-01-07 18:24:26

标签: python xml jenkins python-requests

我让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))

我也得到了标题:

{'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发布相同的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。

1 个答案:

答案 0 :(得分:2)

使用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))

BTW:你可能想看一下autojenkins Python模块。