http.server:解码对JSON的POST请求

时间:2015-05-11 23:33:56

标签: python json python-3.x post urldecode

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

客户端应该通过POST发送一个json-object。

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结果转换回dict(或中间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)]

或者某些常用模块中是否有一些经过良好调试的功能?

2 个答案:

答案 0 :(得分:3)

如果您可以更改请求,请以JSON格式发送:

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

答案 1 :(得分:2)

你可以这样使用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']}
  

解析作为字符串参数给出的查询字符串(类型的数据)   应用程序/ x-WWW窗体-urlencoded)。数据以字典形式返回。

因此,如果您的客户应该发送json,请使用@ BrentWashBurne的想法发布为json。