我使用它将URL参数(在HTTP请求主体中作为字节接收)转换为JSON字符串:
import urllib.parse, json
def params_asbytes_to_json(b):
s = b.decode() # bytes to str
x = urllib.parse.parse_qsl(s) # parse_qsl
d = dict(x) # convert to dict
return json.dumps(d) # convert to string with json
print(params_asbytes_to_json(b'a=b&c=d')) # {"a": "b", "c": "d"}
它可以工作,但由于它涉及许多编码/解码步骤,我怀疑它效率低下(如果我的服务器接收到许多请求)
从字节a=b&c=d
到JSON字符串{"a": "b", "c": "d"}
是否有更短/更快的距离?
PS:此数据从HTML <form>
发送,如下所示:
<form action='/do' method='post'>
<input type='text' name='a' value='b'>
<input type='submit'>
</form>
对于其他页面,通过(普通)Javascript:
var xhr = new XMLHttpRequest();
xhr.open("POST", "/do");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var fd = new FormData(document.querySelector('form'));
fd.append('dt', +new Date());
xhr.send(new URLSearchParams(fd).toString());
PS:我已经阅读了How to send a JSON object using html form data,但是我需要我的网站工作,即使Javascript被禁用,所以我不能100%依赖XMLHttpRequest+JSON.serialize:它只需要一个<form>
提交即可。据我所知,标准HTML表单不能直接作为JSON发布,对吗
您可以使用
urllib.parse.parse_qs()
而不是urllib.parse.parse_qsl()
来保存一个步骤。它返回一个字典而不是一个列表,因此不需要dict()
步骤但是,正如注释中指出的,这将把字典值设置为列表,而不是单个字符串,以允许查询字符串中存在重复键。您的版本只会丢弃重复项。因此,要么按您的方式执行,要么在调用
json.dumps()
之前从字典中的列表中提取元素您也不需要使用
b.decode()
。urllib.parse
函数接受bytes
对象并对其进行解码相关问题 更多 >
编程相关推荐