Python请求类似于我的unix curl脚本

时间:2014-02-12 09:25:17

标签: python unix python-2.7 curl python-requests

我有一个生成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})

我在这里做错了吗?

2 个答案:

答案 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就可以了。