2015-05-11 209 views
1

我正在写基于http.server一个非常简单的HTTP服务器(使用Python-3)http.server:解码POST请求JSON

客户端应该通过POST发送JSON对象。

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

这个罚款到达在服务器上,但在serializd形式

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)] 

或者是有一些良好的调试功能,可以在一些共同的模块?

回答

3

如果你可以改变的请求,则在JSON发送:

import json 
payload={'text': 'bi ba buzemann!', 
     'nouns': ['streetlight', 'situation'], 
     'states': ['solid', 'fluid'] 
     } 
requests.post(url, data=json.dumps(payload)) 
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。