私はカールで次の作業要求をpython要求に変換しようとしています(要求を使用して http://docs.python-requests.org/en/v0.10.7 / )。
curl --data 'query={"tags":["test1","test2"]}' http://www.test.com/match
(注意してください、私は偽のURLを使用しましたが、コマンドは実際のURLで動作します)
受信側(Flaskで実行)はこれを行います。
@app.route("/match", methods=['POST'])
def tagmatch():
query = json.loads(request.form['query'])
tags = query.get('tags')
... does stuff ...
return json.dump(stuff)
Mac OS X(10.9)で実行されたcurl(7.30)では、上記のコマンドはタグクエリを使用してフィルタリングされた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
私は何か小さなものを見逃していると感じています。
ありがとうございました
サーバーはJSONを期待していますが、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
Python Requests conversion helper at http://curl.trillworks.com へのすばらしいオープンソースcURLがあります。これは完璧ではありませんが、多くのことを助けます特にChrome "cURLとしてコピー"コマンドを変換する場合。プログラムで変換を行う必要がある場合は ノードライブラリ もあります。
私は リクエスター と呼ばれるSublime Text用のHTTPクライアントプラグインを書きました。その機能の1つは cURLの呼び出しをリクエストに、またはその逆 に変換することです。
Sublime Textを使用している場合、これがおそらく最も速くて簡単なオプションです。そうでない場合は、cURLからリクエストへの変換を実際に処理するコードを次に示します。これはベース ncurl ですが、さまざまな改善とバグ修正が行われています。
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'
これを試して:
https://github.com/spulec/uncurl
import uncurl
print uncurl.parse("curl 'https://pypi.python.org/pypi/uncurl' -H
'Accept-Encoding: gzip,deflate,sdch'")
requests
を使用したコードとFlaskから、適切なデータ形式を送信していないようです。 payloadは次のようになります。
_payload = {'query': {'tags': ['test1', 'test2']},}
_
requests.post()
を使用する場合、これは投稿データとして正常ではないようです。したがって、ここにHTMLフォームを投稿した場合は、問題を解決する方が明確である可能性があります。
ここに別の同様の質問があります: sing Python Requests to pass through through a login/password
ncurl ライブラリを使用してみてください。その仕事をするのはかなりいいです。私はそれを試しました。
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={},
)
命を救う
より簡単な方法は次のとおりです。
お役に立てれば!
クレジット: Onkaar Singh