web-dev-qa-db-fra.com

Conversion des requêtes curl en python

J'essaie de convertir la requête de travail suivante en boucle en une requête python (à l'aide de Requests http://docs.python-requests.org/en/v0.10.7/ ).

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

(notez s'il vous plaît que j'ai utilisé une fausse URL mais la commande fonctionne avec la vraie URL)

Le destinataire (exécuté dans Flask) fait ceci:

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

Sous curl (7.30), sous Mac OS X (10.9), la commande ci-dessus renvoie correctement une liste JSON filtrée à l'aide de la requête de balise.

Mon script python est comme suit, il retourne une demande 400 bad. 

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

Je pense que je manque quelque chose de petit et toute aide serait appréciée. 

Je vous remercie

13
zalc

Votre serveur attend JSON, mais vous ne l'envoyez pas. Essaye ça:

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
Lukasa

Il existe un formidable assistant de conversion open source CURL vers Python Requests à l’adresse http://curl.trillworks.com . Ce n'est pas parfait, mais aide beaucoup de temps. Surtout pour convertir les commandes "Copier en tant que cURL" de Chrome. Il existe également une bibliothèque node si vous devez effectuer les conversions par programme 

cURL from Chrome

21
Gourneau

J'ai écrit un plugin client HTTP pour Sublime Text appelé Requester , et l'une de ses fonctionnalités est de convertir les appels de cURL en demandes, et vice versa .

Si vous utilisez Sublime Text, c'est probablement l'option la plus rapide et la plus simple. Sinon, voici le code qui gère réellement la conversion de cURL en demandes. Il est basé sur uncurl , mais avec diverses améliorations et corrections de bugs.

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 __== "__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)

Vous pouvez créer un script avec ce code, par exemple. curl_to_request.py, et appelez ce script à partir de la ligne de commande comme suit. Cela fonctionnera pour Python 2 et 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
kylebebak

essaye ça:

https://github.com/spulec/uncurl

import uncurl

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

D'après votre code utilisant requests et dans Flask, il semble que vous n'envoyiez pas le bon format de données. Le charge utile devrait être comme ceci:

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

Cela ne semble pas normal en tant que données de publication lorsque vous utilisez requests.post(). Donc, si vous avez posté le formulaire html ici, il aurait peut-être été plus clair de résoudre le problème.
Voici une autre question similaire: Utilisation de requêtes Python pour transmettre un identifiant/mot de passe

0
flyer

Sauve ta vie 

Une approche plus simple serait:

  1. Ouvrez POSTMAN
  2. Cliquez sur l'onglet "Importer" en haut à gauche.
  3. Sélectionnez l'option Texte brut et collez votre commande cURL.
  4. Appuyez sur Importer et vous aurez la commande dans votre constructeur Postman!

J'espère que cela t'aides!

crédit: Onkaar Singh

0
MKRNaqeebi