python - 在 webhook 中解析 JSON

标签 python json python-3.x webhooks

我有一个 url,想将一些 JSON 数据发布到其中,但在解码数据时遇到问题。我正在使用 Postman 测试向 webhook 发送数据,并且我已经设置了一个系统来捕获 webhook 接收的内容。当我运行以下代码(python)时:

from urllib.parse import parse_qs
data = parse_qs(request.body.decode())

我得到以下输出,存储在 data 变量中:

{' name': [‘”keyOne”\r\n\r\nValueone\r\n——————————————494388199321720430876911\r\nContent-Disposition: form-data', 
‘”keyTwo”\r\n\r\nValuetwo\r\n——————————————494388199321720430876911\r\nContent-Disposition: form-data', 
‘”keyThree”\r\n\r\nValuethree\r\n——————————————494388199321720430876911--\r\n']}

我还应该如何尝试解码 JSON 数据?当我尝试使用 json.loads 时,我遇到的早期错误是 JSON 对象必须是字符串而不是字节

最佳答案

由于您尝试解析的数据似乎是多部分/表单数据,我认为最好的方法是 cgi.parse_multipart 。为此,您需要请求正文和边界,您可以使用 cgi.parse_header 从 Content-Type header 获取它们。

示例:

import cgi
from io import BytesIO
import requests

data = {'param1':'val1', 'param2':'val2'}
files = {'param3':('fname', 'fdata')}
r = requests.post('http://httpbin.org', data=data, files=files)

boundary = cgi.parse_header(r.request.headers['Content-Type'])[1]
boundary['boundary'] = boundary['boundary'].encode()
data = cgi.parse_multipart(BytesIO(r.request.body), boundary)
print(data)

{'param1': [b'val1'], 'param2': [b'val2'], 'param3': [b'fdata']}

结果是一个字典,其中包含每个字段的字段名称和值列表(以字节为单位)。
然后,您可以解码 data 中的第一项值以获取字符串字典。

data = {k:v[0].decode() for k,v in data.items()}
print(data)

{'param1': 'val1', 'param2': 'val2', 'param3': 'fdata'}

关于python - 在 webhook 中解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47483031/

相关文章:

php 将数据存储在 mysql 中作为可选(“a”)而不是普通字符串

Python Matplotlib - 使用 Imsave 强加形状尺寸

python - MySQLdb._exceptions.OperationalError OperationalError : (1045, "Access denied for user ' root' @'localhost'(使用密码:YES)“)

python - 将 Pandas 列中的日期时间格式化为季度

来自数组的 JSON 打印无效的 json

python - 如何使用 os.listdir 在 Python3 中获取文件信息?

python - 如何清除 Tkinter ListBox Python

json.Marshal 如何处理 http.newRequest 的主体

python - 填充 torch 张量(或 numpy 数组)列表

python-3.x - 如何将 python 版本 3.5.6 安装到 ubuntu/Linux 中?