2013-12-09 12 views
10

Próbuję przekonwertować następujące żądanie pracy w curl na żądanie Pythona (przy użyciu żądania http://docs.python-requests.org/en/v0.10.7/).Konwersja curl na python Żądania

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

(proszę zauważyć, Użyłem fałszywy adres URL, ale komenda nie działa z rzeczywistym URL)

stronie odbiorczej (RAN w kolbie) jest to:

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

W curl (7.30), uruchomiono w systemie Mac OS X (10.9) powyższe polecenie poprawnie zwraca listę jsonów, która została przefiltrowana przy użyciu zapytania znacznika.

Mój skrypt python wygląda następująco, zwraca 400 nieprawidłowych żądań.

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 

Czuję, że brakuje mi czegoś małego i każda pomoc byłaby doceniana.

Dziękuję

+0

ładowność = { 'query': "{ "tagi": [ "test1", "test2"]}} działa, ale ulotka wskazał mi właściwy kierunek. Dziękuję Ci. Nie tworzyłem właściwie dyżuru python. – zalc

Odpowiedz

5

Twój serwer oczekuje JSON, ale go nie wysyłasz. Spróbuj tego:

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 
+0

W nowych wersjach żądań znajduje się również parametr json do opublikowania. –

0

z kodu przy użyciu requests aw Kolby, wydaje się nie pisać odpowiedni format danych. ładowność powinno być tak:

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

To nie wydaje się normalne dane pocztowym przy użyciu requests.post(). Jeśli więc opublikowałeś tutaj formularz html, rozwiązanie problemu mogło być bardziej oczywiste.
Oto inne podobne pytanie: Using Python Requests to pass through a login/password

16

Jest wspaniałym open source cURL do Pythona kupna pomocnika konwersji na http://curl.trillworks.com. Nie jest doskonały, ale pomaga dużo czasu. Specjalnie do konwersji poleceń "Kopiuj jako cURL" w Chrome. Istnieje również node library jeśli trzeba zrobić konwersje programowo

cURL from Chrome

+0

Dzięki za tonę! Idealna strona! –

+0

Naprawdę przydatna wskazówka. – Vikrame

1

napisałem plugin dla klienta HTTP Sublime Text zwanego Requester, a jedną z jego cech jest przekształcenie calls to cURL to Requests, and vice versa.

Jeśli używasz Sublime Text, jest to prawdopodobnie najszybsza, najłatwiejsza opcja. Jeśli nie, oto kod, który faktycznie obsługuje konwersję z cURL do Żądania. Opiera się na uncurl, ale zawiera różne ulepszenia i poprawki błędów.

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) 

Można utworzyć skrypt z tym kodem, np. curl_to_request.py i wywołaj ten skrypt z wiersza poleceń w taki sposób. Będzie działać zarówno w Pythonie 2, jak i Pythonie 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'