2016-05-30 49 views
1

我正在編寫遊戲的POST請求我正在嘗試製作腳本。對於這篇文章,我使用的是共同的req = urllib.request.Request(url=url, data=params, headers=headers)首先,我有一個需要的數據字典,我必須用params = urllib.parse.urlencode(OrderedDict[])爲什麼urllib.parse.urlencode不會將「_」更改爲%5F?

編碼它然而,這給了我一個字符串,但不是正確的!它會給我:

&x=_1&y_=2&_z_=3 

但是,遊戲編碼事情的方式,它應該是:

&x=%5F1&y%5F=2&%5Fz%5F=3 

所以我的不編碼下劃線爲「%5F」。我該如何解決?如果可以,我有遊戲使用的參數(在url中,預編碼),我可以在請求的數據字段中使用它嗎?

回答

1

下劃線不需要編碼,因爲它們是URL中的有效字符。

作爲每RFC 1738

不安全:

字符可以是不安全的多種原因。空格 字符是不安全的,因爲重要的空格可能會消失,並且當轉錄URL或 排版或受到文字處理程序的處理時可能會引入不重要的空格。 字符<>是不安全的,因爲它們被用作圍繞自由文本的URL的 分隔符;引號(")用於在某些系統中爲 分隔URL。字符#是不安全的,並且應始終編碼 ,因爲它在萬維網和其他 系統中用於從可能遵循它的片段/錨點標識符中劃分URL。字符%是不安全的,因爲它用於 其他字符的編碼。其他字符是不安全的,因爲 網關和其他傳輸代理有時會修改 這樣的字符。這些字符是{}|\^~[]`

所有不安全的字符必須始終在URL中進行編碼。

所以_%5F取代的原因是a不被%61替代的相同的理由:它只是沒有必要的。 Web服務器不會(或不應該)關心這兩種方式。

如果你想使用Web服務器做護理(但請先檢查,如果是這樣的話),你就必須做一些體力勞動,如urllibs報價does not support quoting_

的urllib.parse。quote(string,safe ='/',encoding = None,errors = None)

使用%xx轉義替換字符串中的特殊字符。字母,數字和字符_.-從不引用。

您可以用自己的功能包裝quote()並將其傳遞給urlencode()。像這樣(完全未經測試):

def extra_quote(*args, **kwargs): 
    quoted = urllib.pars.quote(*args, **kwargs) 
    return str.replace(quoted, '_', '%5F') 

urllib.parse.urlencode(query, quote_via=extraquote) 
+0

謝謝!我用你說的和我讀過我的代碼。 。 。事實證明,我使用'int(time.time())'而不是'int(time())'作爲時間戳。 。 。 >< – XaNaX

相關問題