2016-12-05 105 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