我使用$ .fileDownload将数据从客户端发送到服务器(Python)。 API会接收数据,但是,如jQuery fileDownload docs所述,数据将使用$ .param进行序列化。问题是我需要使用JSON格式的数据,以便可以处理它并使用它的key:value对创建文件。我一直在试图解决这个问题,但是似乎似乎并没有采取任何措施来“反序列化”它。似乎我也无法让$ .fileDownload首先将数据作为JSON对象发送。有什么办法可以将序列化数据转换为JSON?
这是我的JavaScript请求:
let data = {
'name': item.Name,
'rows': item.rows
}
window.$.fileDownload('/api/export-report-excel', {
httpMethod: 'POST',
encodeHTMLEntities: true,
data: data
})
在我的API中,我尝试了json方法(json.dumps等),但是无法转换序列化的对象。
$ .fileDownload状态:
//数据必须是一个对象(将被序列化$ .param)或已经是一个key = value参数字符串
编辑:
在我的Falcon API中:
@route('/api/export-report-excel')
class ExportReportToExcel(object):
def on_post(self, req, resp):
data = req.stream.read()
log.info(data)
log.info(data)输出:
b'name =优先级+规则和行%5B0%5D%5BSegment%5D = HH + wo + TV&rows%5B0%5D%5BValue%5D = 6&rows%5B0%5D%5BCampaignType%5D = CampaignType%3F&rows%5B0%5Dtype%5BCamp 5D = Predefined + Contract&rows%5B0%5D%5BChannel%5D = WIND + STORE&rows%5B0%5D%5BPriority%5D = 1&rows%5B1%5D%5BSegment%5D = HH + wo + TV&rows%5B1%5D%5BValue%5D = 6&rows%5B1%5D%5BCampaignType%5D = CampaignType%3F&rows%5B1%5D%5BCampaignSubtype%5D = Predefined + Contract&rows%5B1%5D%5BChannel%5D = SMART + WIND + STORE + MALL&rows%5B1%5 %% 2'
最佳答案
这是表单编码的数据,您可以在Python中使用urllib.parse.parse_qs
进行解析。
>>> from urllib import parse
>>> parse.parse_qs('name=Priority+Rules&rows%5B0%5D%5BSegment%5D=HH+wo+TV&rows%5B0%5D%5BValue%5D=6&rows%5B0%5D%5BCampaignType%5D=CampaignType%3F&rows%5B0%5D%5BCampaignSubtype%5D=Predefined+Contract&rows%5B0%5D%5BChannel%5D=WIND+STORE&rows%5B0%5D%5BPriority%5D=1&rows%5B1%5D%5BSegment%5D=HH+wo+TV&rows%5B1%5D%5BValue%5D=6&rows%5B1%5D%5BCampaignType%5D=CampaignType%3F&rows%5B1%5D%5BCampaignSubtype%5D=Predefined+Contract&rows%5B1%5D%5BChannel%5D=SMART+WIND+STORE+MALL&rows%5B1%5D%5BPriority%5D=2')
{'name': ['Priority Rules'],
'rows[0][Segment]': ['HH wo TV'],
'rows[0][Value]': ['6'],
'rows[0][CampaignType]': ['CampaignType?'],
'rows[0][CampaignSubtype]': ['Predefined Contract'],
'rows[0][Channel]': ['WIND STORE'],
'rows[0][Priority]': ['1'],
'rows[1][Segment]': ['HH wo TV'],
'rows[1][Value]': ['6'],
'rows[1][CampaignType]': ['CampaignType?'],
'rows[1][CampaignSubtype]': ['Predefined Contract'],
'rows[1][Channel]': ['SMART WIND STORE MALL'],
'rows[1][Priority]': ['2']}
我不知道Falcon,但我确信它可以直接访问此数据,而无需访问原始流或传递到
parse_qs
。在Django或Flask中,您可以通过request.POST
来获得它,这是一个字典;浏览Falcon文档,看来req.params
可能做类似的工作,尽管您可能需要先将auto_parse_form_urlencoded
选项设置为True。关于javascript - $ .param序列化对象为JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53338028/