【问题标题】:Conversion of curl to python Requestscurl 到 python 请求的转换
【发布时间】:2013-12-26 00:08:17
【问题描述】:

我正在尝试将 curl 中的以下工作请求转换为 python 请求(使用请求http://docs.python-requests.org/en/v0.10.7/)。

curl --data 'query={"tags":["test1","test2"]}' http://www.test.com/match

(请注意,我使用的是假网址,但该命令确实适用于真实网址)

接收端(在 Flask 中运行)这样做:

@app.route("/match", methods=['POST'])
def tagmatch():
    query = json.loads(request.form['query'])
    tags = query.get('tags')
    ... does stuff ...
    return json.dump(stuff)

在 curl (7.30) 中,在 Mac OS X (10.9) 上运行,上面的命令正确返回了一个使用标签查询过滤的 json 列表。

我的python脚本如下,它返回一个400 bad request。

import requests

payload = {"tags":["test1", "test2"]}
# also tried  payload = 'query={"tags":["test1","test2"]}'
url = 'http://www.test.com/match'

r = requests.post(url, data=payload)

if __name__=='__main__':

     print r.text

我觉得我遗漏了一些小东西,如果有任何帮助,我将不胜感激。

谢谢

【问题讨论】:

  • payload = {'query': '{"tags":["test1","test2"]}'} 有效,但传单为我指明了正确的方向。谢谢你。我没有正确形成 python dict。

标签: python python-2.7 curl python-requests


【解决方案1】:

尝试使用uncurl 库。做它的工作非常好。我试过了。

u = uncurl.parse(
        "curl -X GET 'https://mytesturl.com/' -H  'accept: application/json' -H  'Authorization: 1234567890'")
    print(u)

打印出来,

requests.get("https://mytesturl.com/",
    headers={
        "Authorization": "1234567890",
        "accept": "application/json"
    },
    cookies={},
)

【讨论】:

    【解决方案2】:

    拯救你的生命

    更简单的方法是:

    1. 打开邮递员
    2. 点击左上角的“导入”标签。
    3. 选择原始文本选项并粘贴您的 cURL 命令。
    4. 点击导入,您将在 Postman 构建器中拥有该命令!

    希望这会有所帮助!

    信用:Onkaar Singh

    【讨论】:

    • 我们需要一个自动化解决方案,Postman 仅用于检查或使用 API。我的目的是从“Copy as Curl”发送 1000 个请求,为此我们需要自动化这个过程。拯救你的生命!
    【解决方案3】:

    试试这个:

    https://github.com/spulec/uncurl

    import uncurl
    
    print uncurl.parse("curl 'https://pypi.python.org/pypi/uncurl' -H 
    'Accept-Encoding: gzip,deflate,sdch'")
    

    【讨论】:

      【解决方案4】:

      我为 Sublime Text 编写了一个 HTTP 客户端插件,名为 Requester,它的一个功能是转换 calls to cURL to Requests, and vice versa

      如果您使用的是 Sublime Text,这可能是您最快、最简单的选择。如果没有,这里是实际处理从 cURL 到请求的转换的代码。它基于 uncurl,但有各种改进和错误修复。

      import argparse
      import json
      try:
          from urllib.parse import urlencode, parse_qsl
      except ImportError:  # works for Python 2 and 3
          from urllib import urlencode
          from urlparse import parse_qsl
      
      
      if __name__ == "__main__":
          parser = argparse.ArgumentParser()
          parser.add_argument('command')
          parser.add_argument('url')
          parser.add_argument('-X', '--request', default=None)
          parser.add_argument('-d', '--data', default=None)
          parser.add_argument('-G', '--get', action='store_true', default=False)
          parser.add_argument('-b', '--cookie', default=None)
          parser.add_argument('-H', '--header', action='append', default=[])
          parser.add_argument('-A', '--user-agent', default=None)
          parser.add_argument('--data-binary', default=None)
          parser.add_argument('--compressed', action='store_true')
      
          parsed_args = parser.parse_args()
      
          method = 'get'
          if parsed_args.request:
              method = parsed_args.request
      
          base_indent = ' ' * 4
          post_data = parsed_args.data or parsed_args.data_binary or ''
          if post_data:
              if not parsed_args.request:
                  method = 'post'
              try:
                  post_data = json.loads(post_data)
              except ValueError:
                  try:
                      post_data = dict(parse_qsl(post_data))
                  except:
                      pass
      
          cookies_dict = {}
      
          if parsed_args.cookie:
              cookies = parsed_args.cookie.split(';')
              for cookie in cookies:
                  key, value = cookie.strip().split('=')
                  cookies_dict[key] = value
      
          data_arg = 'data'
          headers_dict = {}
          for header in parsed_args.header:
              key, value = header.split(':', 1)
              if key.lower().strip() == 'content-type' and value.lower().strip() == 'application/json':
                  data_arg = 'json'
      
              if key.lower() == 'cookie':
                  cookies = value.split(';')
                  for cookie in cookies:
                      key, value = cookie.strip().split('=')
                      cookies_dict[key] = value
              else:
                  headers_dict[key] = value.strip()
          if parsed_args.user_agent:
              headers_dict['User-Agent'] = parsed_args.user_agent
      
          qs = ''
          if parsed_args.get:
              method = 'get'
              try:
                  qs = '?{}'.format(urlencode(post_data))
              except:
                  qs = '?{}'.format(str(post_data))
              print(post_data)
              post_data = {}
      
          result = """requests.{method}('{url}{qs}',{data}\n{headers},\n{cookies},\n)""".format(
              method=method.lower(),
              url=parsed_args.url,
              qs=qs,
              data='\n{}{}={},'.format(base_indent, data_arg, post_data) if post_data else '',
              headers='{}headers={}'.format(base_indent, headers_dict),
              cookies='{}cookies={}'.format(base_indent, cookies_dict),
          )
          print(result)
      

      您可以使用此代码制作脚本,例如curl_to_request.py,然后像这样从命令行调用这个脚本。它适用于 Python 2 和 Python 3。

      python curl_to_request.py curl -X POST -d 'key2=value2&key1=value1' 'http://httpbin.org/post'
      
      python curl_to_request.py curl -X POST -H 'Content-Type: application/json' -d '{"key2": "value2", "key1": "value1"}' 'http://httpbin.org/post'
      
      python curl_to_request.py curl -X POST -H 'Content-Type: application/json' -d '[1, 2, 3]' 'http://httpbin.org/post'
      
      python curl_to_request.py curl -X POST -H 'Content-Type: application/json' -d '{"name": "Jimbo", "age": 35, "married": false, "hobbies": ["wiki", "pedia"]}' 'http://httpbin.org/post'
      
      python curl_to_request.py curl -X GET 'http://httpbin.org/get?key2=value2&key1=value1'
      
      python curl_to_request.py curl -X GET -H 'key1: value1' -H 'key2: value2' 'http://httpbin.org/headers'
      
      python curl_to_request.py curl -X GET -b 'key1=value1;key2=value2' 'http://httpbin.org/cookies'
      

      【讨论】:

      • 我只是想对这个例子说声谢谢。事实证明,这是一种将其他命令和选项转换为 Python 的非常有用的技术。
      【解决方案5】:

      http://curl.trillworks.com 上有一个很棒的开源 cURL 到 Python 请求转换助手。它并不完美,但在很多时候都有帮助。特别是用于转换 Chrome“复制为 cURL”命令。如果您需要以编程方式进行转换,还有一个 node library

      【讨论】:

      • 非常感谢!完美的网站!
      • 非常有用的提示。
      【解决方案6】:

      您的服务器需要 JSON,但您没有发送它。试试这个:

      import requests
      import json
      
      payload = {'query': json.dumps({"tags":["test1", "test2"]})}
      url = 'http://www.test.com/match'
      
      r = requests.post(url, data=payload)
      
      if __name__=='__main__':
          print r.text
      

      【讨论】:

      • 在新版本的requests中,还有一个json参数可以post。
      【解决方案7】:

      从您使用 requests 和 Flask 的代码来看,您似乎没有发布正确的数据格式。 payload 应该是这样的:

      payload = {'query': {'tags': ['test1', 'test2']},}
      

      当使用requests.post() 时,这似乎不正常作为发布数据。所以如果你把html表单贴在这里,可能解决问题就更清楚了。
      这是另一个类似的问题:Using Python Requests to pass through a login/password

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2016-01-30
        • 2020-03-18
        • 2023-04-08
        相关资源
        最近更新 更多