6 题: 将curl转换为python请求

在...创建的问题 Wed, Jul 11, 2018 12:00 AM

我正在尝试将curl中的以下工作请求转换为python请求(使用Requests 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错误请求。

 
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

我觉得我错过了一些小事,任何帮助都会受到赞赏。

谢谢

    
14
  1. payload = {'query':'{“tags”:[“test1”,“test2”]}}}有效,但传单指向正确的方向。谢谢。我没有正确形成python dict。
    2013-12-09 04:32:03Z
  2. 醇>
    6答案                              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
    
        
    8
    2013-12-09 10:13:24Z
    1. 在新版本的请求中,还有一个json参数要发布。
      2015-01-06 17:18:08Z
    2. 醇>

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

        
    23
    2016-01-21 20:30:27Z
    1. 非常感谢!完美的网站!
      2017-02-04 08:20:51Z
    2. 非常有用的提示。
      2017-11-26 04:52:16Z
    3. 醇>

    我为Sublime Text编写了一个名为 Requester 的HTTP客户端插件,其中一个功能是将调用cURL转换为请求,反之亦然

    如果您使用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'
    
        
    1
    2017-08-01 15:17:53Z
    1. 我只想说谢谢你这个例子。它被证明是一种非常有用的技术ique用于将其他命令和选项转换为Python。
      2019-02-19 04:17:21Z
    2. 醇>

    试试这个:

    https://github.com/spulec/uncurl

     
    import uncurl
    
    print uncurl.parse("curl 'https://pypi.python.org/pypi/uncurl' -H 
    'Accept-Encoding: gzip,deflate,sdch'")
    
        
    1
    2017-08-18 05:29:15Z

    使用requests和Flask中的代码,您似乎没有发布正确的数据格式。 有效负载应该是这样的:

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

    这在使用requests.post()时作为发布数据似乎不正常。因此,如果您在此处发布了html表单,则可能更清楚地解决问题。
    这是另一个类似的问题:使用Python请求通过登录/密码

        
    0
    2017-05-23 12:32:14Z

    拯救你的生命

    更简单的方法是:

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

      希望这有帮助!

      信用: Onkaar Singh

          
    0
    2019-02-12 17:53:28Z
来源放置 这里