http.server:解码 POST 请求到 JSON

http.server: decoding POST request to JSON

我正在编写一个基于 http.server 的非常简单的 http 服务器(使用 Python-3)

客户端应该通过POST发送一个json对象。

payload={'text': 'bi ba buzemann!',
         'nouns': ['streetlight', 'situation'],
         'states': ['solid', 'fluid']
        }
requests.post(url, data=payload)

这可以很好地到达服务器,但以序列化形式出现

def do_POST(self:
  length = self.headers['content-length']
  data = self.rfile.read(int(length))
  # b'states=solid&states=fluid&nouns=oracle&text=bi+ba+buzemann%21'

现在我的问题是:如何将这个 urlencoded 结果转回字典(或中间 JSON)?

我是否必须手动执行此操作,如:

for x in str(r).split('&'):
   y,z=x.split('=')
   if not y in d:
      d[y]=[]
   d[y]+=[urllib.parse.unquote_plus(z)]

或者在一些常用模块中是否有一些经过良好调试的函数可用?

您可以像这样使用 parse_qs

>>> from urllib.parse import parse_qs
>>> parse_qs(b'states=solid&states=fluid&nouns=oracle&text=bi+ba+buzemann%21')
{b'nouns': [b'oracle'], b'text': [b'bi ba buzemann!'], b'states': [b'solid', b'fluid']}

Parse a query string given as a string argument (data of type application/x-www-form-urlencoded). Data are returned as a dictionary.

因此,如果您的客户应该发送 json,请按照@BrentWashBurne 的想法将 post 作为 json。

如果您可以更改请求,请在 JSON 中发送:

import json
payload={'text': 'bi ba buzemann!',
         'nouns': ['streetlight', 'situation'],
         'states': ['solid', 'fluid']
        }
requests.post(url, data=json.dumps(payload))