2012-09-21 9 views
6

私はPythonスクリプトでいくつかの自動化をしようとしていますが、問題が発生しました。私はサーバーにPOSTをしようとしています。私は第二引数、arg1は、+valueとして渡され、私は、Pythonでそれを行うときしかし+%2Bに変更されます、PythonのPOSTリクエストに '+'文字を渡す

Line-based text data: application/x-www-form-urlencoded 
arg0=value&arg1=%2Bvalue 
すなわち同等のブラウザ操作のWiresharkのキャプチャを行っている

url = 'http://www.example.com' 
params = {'arg0': 'value', 'arg1': '+value'} 

f = urllib.urlopen(url, urllib.urlencode(params)) 
print f.read() 

それは次のようになります。

Line-based text data: application/x-www-form-urlencoded 
arg0=value&arg1=+value 

は私が要求モジュールをも使用している、それが思われます同じことをすること。

url = 'http://www.example.com' 
params = {'arg0': 'value', 'arg1': '+value'} 

f = requests.post(url, params) 

「+」に関連する問題が発生した場合、Googleはあなたの友人ではありません。

+0

どのバージョンのリクエストを使用していますか? – root

+0

今日のリクエストをピップインストールしました - 0.14.0 –

+5

"+"に関連する問題が発生した場合、Googleはあなたの友人ではありません。 - 特殊文字を検索するには、http://symbolhound.com/ – l4mpi

答えて

7

+文字は、GETまたはPOSTデータを引用するときのスペースの適切なエンコーディングです。したがって、リテラル+文字もエスケープする必要があります。つまり、もう一方の端のスペースにデコードされないようにする必要があります。

コントロールの名前と値がエスケープされる:RFC 2396、section 2.2section 3.4HTML specification, application/x-www-form-urlencoded sectionを参照してください。スペース文字は `+ 'で置き換えられ、予約文字は[RFC1738]のセクション2.2で説明されているようにエスケープされます。

あなたがいることを指定して、空間に+文字をデコードする代わりにリテラルプラス記号ではなく、あなたの代わりにurllib.quote functionを使用してパラメータを自分でエンコードする必要があるとして、そのようなデータを扱うないアプリケーションにデータを投稿している場合+文字はエンコードされるべきではない:

import urllib 
def urlencode_withoutplus(query): 
    if hasattr(query, 'items'): 
     query = query.items() 
    l = [] 
    for k, v in query: 
     k = urllib.quote(str(k), safe=' /+') 
     v = urllib.quote(str(v), safe=' /+') 
     l.append(k + '=' + v) 
    return '&'.join(l) 

デモ:を

>>> urlencode_withoutplus({'arg0': 'value', 'arg1': '+value'}) 
'arg0=value&arg1=+value' 

を使用しては、あなたは単にdata値として上記の関数の結果を渡すことができますが、その場合には、手動でコンテンツタイプを設定する必要があります。

requests.post(url, urlencode_withoutplus(query), 
    headers={'Content-Type': 'application/x-www-form-urlencoded'}) 
+0

それは私が望んでいたのとは逆の方向に進んでいるようです。 uriib.urlencode?を実行する前にurllib.quote(params ['arg1'])を実行する必要があると言っていますか?wiresharkでキャプチャすると '%252Bvalue'しか得られません。 –

+0

@DouglasKastle:いいえ、urllib.urlencodeの代わりにthis *を使用します。 –

+0

申し訳ありませんが完了する前にあなたの答えを見た –

4
urllib2.quote(' ')  # '%20' 
urllib2.unquote('%20') # ' ' 

はなぜちょうどパラメータ部分をUNQUOTEないし。

f = urllib.urlopen(url, urllib.unquote(urllib.urlencode(params))) 
+0

興味深いことに、おそらく十分であるこのケースでは、保護される必要があるいくつかの型のパラメータがあると思います。 –

関連する問題