2012-09-21 26 views
6

我想在Python腳本中執行一些自動操作,並且遇到問題。我正在嘗試執行POST到服務器。在Python中的POST請求中傳遞'+'字符

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

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

我也做了相當的瀏覽器操作,其中第二ARG,arg1作爲+value過去了,但是當我與Python做了+被改爲%2B的Wireshark的捕獲,即

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

當它應該是:

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

我也用了請求模塊,它似乎s做同樣的事情。

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

f = requests.post(url, params) 

谷歌是不是你的朋友,當你有涉及到「+」的問題,因爲它似乎是所有這麼多別的一個問題。

+0

您使用的是什麼版本的請求? – root

+0

我今天做了一個pip安裝請求 - 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' 

當使用requests,你可以簡單地通過在以上功能的data值的結果,但在這種情況下,你需要手動設置內容類型:

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

這似乎是以我想要的相反方式。你是說我應該在做urllib.urlencode之前做一個urllib.quote(params ['arg1']),因爲當我在wireshark上捕獲時只會產生'%252Bvalue'。 –

+0

@DouglasKastle:不,你用這個*代替urllib.urlencode。 –

+0

對不起,我看到你的答案,在它完成之前 –

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

那麼爲什麼不直接解除引用的參數部分:

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

有趣的是,對於這種情況下,可能會是足夠的,我想有一些類型的參數需要保護。 –

相關問題