2017-09-05 6 views
1

辞書としてのparams対テキストなどのparams間のURLの変更私がどのように見えるの署名になりHMACとhashlibを使って署名を生成Pythonの要求 - 私が使用してAPIを呼び出すために、Pythonの要求を使用してい

GET:

4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D 

私はRequestを使用して、文字列としてparamsを指定すると、署名がそのまま使用され、変更されないため、API呼び出しが成功します。

リクエストを使用して辞書として指定すると、上記の署名が何らかの形でURLエンコードされ、%がエンコードされて%25になり、署名が次のように表示されます(%25に注意してください)。

https://example.com/API& 
&parameterA=valueA 
&parameterB=valueB 
&apikey=0e1026af-40ce-e354-f1f2-72d280ca122 
&salt=12345 
&signature=4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D 
:のURLで

url = 'https://example.com/API' 
payload = '&parameterA=valueA&parameterB=valueB&parameterC=valueC& apikey='+apikey+'&salt='+salt+'&signature='+sig 
#payload = {'parameterA': 'valueA', 'parameterB': 'valueB', 'apikey': apikey, 'salt': salt, 'signature': sig} 
r = requests.get(url, params=payload) 
print r.url 

結果:より多くのコンテキストについては

4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D 

は、ここでは、文字列のparamsです

さて、辞書のparams:のURLで

url = 'https://example.com/API' 
payload = {'parameterA': 'valueA', 'parameterB': 'valueB', 'apikey': apikey, 'salt': salt, 'signature': sig} 
r = requests.get(url, params=payload) 
print r.url 

結果:

https://example.com/API 
&signature=4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D 
&salt=12345 
&apikey=0e1026af-40ce-e354-f1f2-72d280ca122 
&parameterA=valueA 
&parameterB=valueB 

注再び署名における%は%に25の

感謝を変更したこと!

答えて

1

辞書をparamsに渡すと、URLがエンコードされます。あなたの文字列はすでにエンコードされているので、二重にエンコードされ、不正な形式の「署名」が作成されます。
あなたがsigをデコードするurllib.unquoteを使用することができます(またはあなただけの'=''%3D'を置き換えることができます)

payload = { 
    'parameterA': 'valueA', 'parameterB': 'valueB', 
    'apikey': apikey, 'salt': salt, 'signature': urllib.unquote(sig) 
} 

のpython3 unquoteurllib.parseに位置していることに注意してください。

+0

ありがとうございます!私はそれが何か小さいことを知っていた。むしろ時期尚早だった署名を生成するときに、URLエンコードを行います。私は将来デモコードをチェックする必要があります。私は洞察力に感謝します、ありがとう! –

関連する問題