我有一个生成url并执行它的unix脚本:
export url='http://test.com';
export job_name='MY_JOB_NAME';
jso="{\"parameter\": [{\"name\":\"BRANCH\",\"value\":\"master\"}, {\"name\":\"GITURL\",\"value\":\"https://github.test.com/test/test.git\"}]}";
curl $url/job/$job_name/build --data-urlencode json="$jso";
我想在Python中做同样的事情,我尝试使用'requests'和'urllib2'模块,但它们似乎没有形成完全相同的请求。
以下是我的尝试:
import requests
import json
url='http://test.com/job/MY_JOB_NAME/build'
params=[{'name':'BRANCH', 'value':'master'}, {'name':'GITURL', 'value':'https://github.test.ebay.com/test/test.git'}]
payload = json.dumps(params)
resp = requests.post(url, data={'json':payload})
我在这里做错了吗?
答案 0 :(得分:2)
如果我们使用你的curl请求命中测试服务器,我们会看到你正在做的是POST一个名为json
的表单数据字段,其值为JSON编码字符串。
~$ curl http://httpbin.org/post --data-urlencode json='{"foo": "bar"}'
{
"url": "http://httpbin.org/post",
"json": null,
"args": {},
"form": {
"json": "{\"foo\": \"bar\"}"
},
"origin": "0.0.0.0",
"data": "",
"headers": {
"Connection": "close",
"Content-Type": "application/x-www-form-urlencoded",
"X-Request-Id": "1b5f0122-9e63-4e58-adff-e59c24f086e5",
"Host": "httpbin.org",
"User-Agent": "curl/7.30.0",
"Content-Length": "35",
"Accept": "*/*"
},
"files": {}
}
话虽如此,我在你的curl脚本和你的python脚本之间看到的主要区别是你发布的JSON编码数据的结构。
你的curl脚本发布了这个:
{
"parameters": [{
"name": "BRANCH",
"value": "foo",
},
{
"name": "GITURL",
"value": "git://example.com/repo",
}]
}
您的请求代码正在发布
{
"name": "BRANCH",
"value": "foo"
}
所以你没有发布相同的数据。如果您复制并粘贴我使用json.dumps
的结构并使用正确的数据,则您对request.post
的调用应该有效。剩下的就是100%正确。
答案 1 :(得分:-1)
试试这个:
params={'BRANCH':'master', 'GITURL':'https://github.test.com/test/test.git'}
resp = requests.post(url, data=payload)
参见requests:post-a-multipart-encoded-file 因为
,所以无需将数据转储到json中您的数据字典将自动进行表单编码 请求
我已经大量使用了请求,只是传递一个dict就可以了。