0

我在 Ruby on Rails 中创建了一个 API。我没有将响应正文与 API 响应一起发回,而是将其广播到外部服务,然后由外部服务负责实时分发给所有连接的客户端(即 WebSockets)。

今天我遇到了一个问题,我意识到我们的第 3 方提供商只允许最大 25kb 的数据包。随着数据增长到超过此限制并且第 3 方服务已开始阻止呼叫,我们的一项响应已开始出现问题。附带说明一下,数据包很少会增长到大于 25kb。

我做了一些研究,正在考虑最好的主意是什么。我正在考虑的一个想法是使用压缩响应ZLib,然后在 JS 端对其进行解压缩。导致此问题的文章是这个 StackOverflow question

我设法使通货紧缩和 Base64 编码正确,但无法在 JS 端解码。我还测试了生成的 Base 64 字符串,但像这样的服务将 base64 字符串标记为无效。

我的代码如下所示:

在 Rails 控制器中

...
compressed_data = Zlib::Deflate.deflate(json_data.to_s)
encoded_data = Base64.encode64(compressed_data)
broadcast encoded_data
...

在接收广播的 JS 中:

import pako from 'pako';
import { decode } from 'js-base64';
...
const decoded = decode(payload.data);
const decompressed = pako.inflate(decoded);
...

当我执行广播时,我收到错误:unknown compression method. 我知道这可能与pako.,但我也尝试了其他方法但没有成功。有没有人有任何想法甚至更好的方法来解决这个问题?

更新:

Rails 中生成的 Base64 字符串如下所示:

eJxlU2Fr2zAQ/SuHP25JkJW2abMPY6OllJWkNGFftmEU+RKLypKRTknD6H/f\nyQ5ru0EQutPdy3vvzr8LUxfz8nJ2NSrIkMViXkj4GjyGCNc+tBjgZxJCXsAq\nbbfePsF3NNa4XTEqaow6mI6Md9xWSgGPqm0RPkC+r8gjeW9yLDn+5vktRDPA\nYWrtJ4uwPBUIka9wr/qiCTze3N6t1o9f1nfLBTzcLK7vFref4cGiiggBdyYS\nU9scQRHkJEE5axjEO6AGoVZH2ODWB+xDlXRmOYGl0wgHhEbtM4xGs8cajj6F\nE2hQuXA0pGokZWyEg7GW4SCiIyDfQwa0uFccW4aI5PUTqF1+PzR+aNDekdKU\noXKT9m1nkQZCeyRiE6ELXmNkvWzniWRlvVYnT+/9gVUuQ4euVjyc16JIKlBV\nK+onJmQ5FuVYynU5nQvBv4kQ4qOQfHvTxCinFpesfc3TscswK2NZANdvTF0z\nuwqfCV0cqDj/JuSSriL1XIUeTXCcjjy3qgvYmtT2qRq3KlkmiZ2PhvqcTiGg\n00cGXKgF4+iADFFXigYdYlzKsTxbl2I+vZpPy4mUs786Ule/K+5Flyya32Uu\nvijL1+KIocrbPcv0gnK66cOzy1ER2fMsPMeDFSy5Mo7ZtGxBtVc2YSzmP0q2\ncSTzMc3HeT5yTvwaFU2/q9kG/oLOR0XLQzeaV7Hq0saa2FTkn9D9a7bl4VKq\n/xuC9W73/kHFNs+5H7HnFcCaZTlFKeTMATf5z/rvMO/VYEtuffkDW0lDVA==\n
4

1 回答 1

0

您的数据以 zlib 标头开始,但压缩数据由于某种原因已损坏。

于 2021-01-19T17:19:26.607 回答