【问题标题】:Python request similar to my unix curl scriptPython 请求类似于我的 unix curl 脚本
【发布时间】:2014-02-12 09:25:16
【问题描述】:

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

我在这里做错了吗?

【问题讨论】:

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


    【解决方案1】:

    如果我们使用您的 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% 正确。

    【讨论】:

    • 我的答案不正确,我知道。曾经有另一个 OP 同意的答案,但现在不见了。
    • 编辑了我的 json 有效负载,使其与 curl json 有效负载相匹配。还是没有看到url执行成功。
    • @PiHorse 如果编辑的问题是您尝试过的,那么您没有发送正确的。您必须对 {'parameters': [{...},{...}]} 进行 JSON 编码。
    【解决方案2】:

    试试这个:

    params={'BRANCH':'master', 'GITURL':'https://github.test.com/test/test.git'}
    resp = requests.post(url, data=payload)
    

    requests:post-a-multipart-encoded-file 无需将数据转储到 json 中,因为

    您的数据字典将自动进行表单编码,当 提出要求

    我经常使用请求,简单地传递一个字典总是可行的。

    【讨论】:

    • 看我的回答。 OP 并未尝试发布多部分编码文件,而仅按照您的建议使用 data 参数将不起作用。您没有足够仔细地阅读 OP 问题,也没有尝试准确了解他们在做什么。
    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多