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
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
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
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'
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'")
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
Sauve ta vie
Une approche plus simple serait:
J'espère que cela t'aides!
crédit: Onkaar Singh