urllib.parse.parse_qs()
而不是urllib.parse.parse_qsl()
保存一个步骤。它返回字典而不是列表,因此您不需要dict()
步骤。我使用它从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"}
它可以工作,但是由于它涉及许多编码/解码步骤,因此我怀疑它效率低下(如果我的服务器收到许多请求)。>>
从字节 PS:此数据是从HTML a=b&c=d
到JSON字符串{"a": "b", "c": "d"}
短/快吗?<form>
这样发送的:<form action='/do' method='post'>
<input type='text' name='a' value='b'>
<input type='submit'>
</form>
并且对于其他页面,通过(Vanilla)Javascript:
,所以我不能100%依赖XMLHttpRequest + JSON.serialize:它只需要与一个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
<form>
提交。据我所知,标准的HTML表单不能直接发布为JSON,对吗?我使用它从URL参数(在HTTP请求的主体中以字节形式接收)到JSON字符串:import urllib.parse,json def params_asbytes_to_json(b):s = b.decode()#字节到str x ... urllib.parse.parse_qs()
而不是urllib.parse.parse_qsl()
保存一个步骤。它返回字典而不是列表,因此您不需要dict()
步骤。但是,正如注释中指出的那样,这会将字典值设置为列表,而不是单个字符串,以允许查询字符串中有重复的键。您的版本只是丢弃重复项。
您也不需要使用b.decode()
。 urllib.parse
函数接受bytes
对象并将其解码。
urllib.parse.parse_qs()
而不是urllib.parse.parse_qsl()
保存一个步骤。它返回字典而不是列表,因此您不需要dict()
步骤。