Python生成的zlib压缩二进制数据在PHP端无法解码的解决方案咨询
根因说明
你从Python控制台打印拿到的b'x\x9c\xabV*(\xcfK-R\xb2RP*I-.Q\xaa\x05\x004\x8c\x05\xc7'是Python bytes对象的可视化字符串表示,不是原始的二进制字节流。直接把这个字符串内容传入Postman请求时,实际发送的是带b'前缀、转义符、单引号后缀的普通文本,不是真实的压缩数据,自然解码失败。
手动替换单引号能临时生效本质是PHP中用双引号包裹字符串时,会自动解析字符串里的\x转义序列为对应的二进制字节,这只是测试场景下的特殊效果,无法用于生产环境。
可行解决方案(无需十六进制转换)
1. 手动Postman测试场景
Python侧导出原始二进制文件
不要用print输出bytes的字符串表示,直接将压缩后的二进制写入文件:
import json import zlib data = {"owner": "test"} compressed = zlib.compress(json.dumps(data).encode("utf-8")) # 写入二进制文件 with open("compressed.bin", "wb") as f: f.write(compressed)
Postman配置
- 新建POST请求,进入「Body」标签页
- 选择
binary类型,点击「Select File」选择上一步生成的compressed.bin文件 - 可按需添加请求头
Content-Type: application/octet-stream,发送请求即可
PHP侧解码代码
直接读取请求原始输入流,无需任何字符串替换:
// 读取请求体原始二进制数据 $compressedData = file_get_contents('php://input'); // 直接解码 $result = json_decode(zlib_decode($compressedData), true); // 输出验证 var_dump($result);
2. Python代码直接发请求场景
以requests库为例,直接将压缩后的bytes对象作为请求体发送即可:
import requests import json import zlib data = {"owner": "test"} compressed = zlib.compress(json.dumps(data).encode("utf-8")) response = requests.post( "你的PHP接口地址", data=compressed, headers={"Content-Type": "application/octet-stream"} ) print(response.text)
内容的提问来源于stack exchange,提问作者Mubbasher Ahmed
相关产品推荐
相关产品推荐

