2016-12-05 21 views
0

如何通過Python中的POST請求發送ASCII編碼文本?我通過POST收到的true_input的長度總是與我發送的長度不同。如何在Python中使用POST請求保留Ascii編碼類型?

def insert_true_input(level, iteration, true_input): 
    url = master_url + "/insert_true_input?" 
    data = {'level': level, 'iteration': iteration, 'true_input': true_input} 
    headers = {'Content-Type': 'text/plain'} 
    res = requests.post(url, params=data, headers=headers).text 
    return res 

,我想送的小樣true_input是直接從numpy.ndarray.tostring()貌似

'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\xc0^@\x00\x00\x00\x00\x00\xc0^@\x00\x00\x00\x00\x00\xc0^@\x00\x00\x00\x00\x00\x00(@\x00\x00\x00\x00\x00\[email protected]'

+0

你想什麼做做到了嗎?你想要在請求正文中發佈數據,還是將它傳遞給查詢字符串?通過對'requests.post()'使用'params'參數,你實際上使用了一個查詢字符串來發布數據,而不是請求主體。如果你想將它作爲主體傳遞,請使用'data'參數,並移除你自定義的Content-Type頭(請求將自動使用Content-Type'application/x-www-form-urlencoded')。 – Guillaume

+0

請爲「true_input」和樣本輸出(完整的HTTP請求標頭和正文)提供一個示例輸入,它會讓您更容易理解您想要的內容。 – Guillaume

+0

@Guillaume謝謝你的回答!請看我更新的問題。 – xxx222

回答

1

正如上文註釋,空字符\x00不能以原始文本發送。你必須以某種方式對它們進行編碼(URL編碼,Base64,json等)。但接下來接收請求的另一方必須進行相應的解碼。 實際上,請求會自動爲查詢字符串中傳遞的參數使用URL編碼,但我懷疑您的java代碼無法正確解碼它們。

請將您的Java代碼發佈給接收方,看看我們可以做些什麼。

建議在Python端,使用Base64:

import base64 
def insert_true_input(level, iteration, true_input): 
    url = master_url + "/insert_true_input?" 
    data = {'level': level, 'iteration': iteration, 'true_input': base64.b64encode(true_input)} 
    res = requests.post(url, params=data, headers=headers).text 
    return res 

使用JSON(請求,如果使用json參數.post()會爲你做的工作):

def insert_true_input(level, iteration, true_input): 
    url = master_url + "/insert_true_input?" 
    data = {'level': level, 'iteration': iteration, 'true_input': true_input} 
    res = requests.post(url, json=data, headers=headers).text 
    return res 
+0

你救了我的命。謝謝!!! – xxx222

+0

我從未嘗試過base64,事實證明它非常適合用於numpy數組的編碼。 – xxx222

+0

不客氣。實際上,無論何時只要在純文本介質上傳輸或存儲任意二進制數據,base64都是完美的。 – Guillaume

1

你必須使用str.encode('ascii')編碼的字符串:

def insert_true_input(level, iteration, true_input): 
    url = master_url + "/insert_true_input?" 
    data = {'level': level, 'iteration': iteration, 'true_input': true_input.encode('ascii')} 
    headers = {'Content-Type': 'text/plain'} 
    res = requests.post(url, params=data, headers=headers).text 
    return res 
+0

感謝您的回答!然而,我的實際問題是,如何保持'true_input'與POST過程保持不變,這與'res'沒有關係。 POST方法將我的數據發送到另一端,我沒有在這裏發佈。 – xxx222

+0

@ xxx222我看到了,我編輯了我的答案 – user312016