我使用 $.fileDownload 将数据从客户端发送到服务器 (Python)。 API 接收数据,但根据 jQuery fileDownload 文档 状态,数据使用 $.param 进行序列化。问题是我需要 JSON 格式的数据,以便我可以处理它并使用它的键:值对创建文件。我一直在试图解决这个问题,但似乎没有采取任何措施来“反序列化”它。似乎我一开始就无法让 $.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 指出:
// data must be an object (which will be $.param serialized) or already a key=value param string
编辑:
在我的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=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'
最佳答案
这是表单编码的数据,您可以使用 urllib.parse.parse_qs
在 Python 中对其进行解析。
>>> 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/