GWT RPC 如何在其有效负载中编码 java.lang.Long 值?

Posted

技术标签:

【中文标题】GWT RPC 如何在其有效负载中编码 java.lang.Long 值?【英文标题】:How does GWT RPC encode java.lang.Long values in it's payload? 【发布时间】:2014-03-05 17:10:20 【问题描述】:

我目前正在编写一个解析器来解释 GWT RPC 的响应。

但是,我很难弄清楚 GWT 用于对 java.lang.Long 值进行编码的编码(即不是原始的 long ——它将是 Base64)

这是一个示例 RPC 有效负载,用于通过 ID 检索组对象(通过 .retrieve(java.lang.Long id)):

7|0|5|http://10.0.1.35:8005/platform/gwt/com.application.gwt.Contacts/|57C71F0104C208A16262D2898A6133DD|com.application.gwt.client.rpc.GroupService|retrieve|java.lang.Long/4227064769|1|2|3|4|1|5|5|PFu|

我已经设法弄清楚值“PFu”(最后)是检索方法中使用的组的编码 ID。

实际组的 ID 是“61806”。

所以我的问题是,“61806”如何变成“PFu”?这里使用什么编码?它似乎不是 Base 64。

其他情况包括:

iW = 2198 D4O = 15886

【问题讨论】:

嗨,亚当,你的解码器完成了吗?你开源了吗?你用的是哪种语言,javascript 【参考方案1】:

事实上,根据你的例子,它是完全有效的 Base64。

但是,最后两位数字(值 62、63)似乎分别使用“$”和“_”,而不是更常见的“+”和“/”。

下划线使其 URL 安全并在某些实现中使用,但美元符号必须是他们自己发明的。

如果您通过转换器运行示例,如果值被 ascii 编码(它们可能是),您可能会得到错误的结果。

【讨论】:

这非常有帮助。那么,我该如何正确解码这些值呢? 我猜是乘以 64 的幂。所以 D4O 变为 3*64^2 + 56*64^1 + 14*64^0 = 12288 + 3584 + 14 = 15886。【参考方案2】:

您可以使用 GWT com.google.gwt.user.server.Base64Utils 类来获取编码/解码的值。

例如

String val  = Base64Utils.toBase64(727854);
long l  = Base64Utils.longFromBase64("WIe7dms");

【讨论】:

以上是关于GWT RPC 如何在其有效负载中编码 java.lang.Long 值?的主要内容,如果未能解决你的问题,请参考以下文章

出于调试目的从 GWT RPC 有效负载中反序列化日期和时间戳

对于 GWT GAE Java 应用程序,这种 GWT/RPC 安全方法的安全性如何?

GWT RPC 和持久性 Java 对象

如何将 Swagger UI 添加到现有的 GXT 或 GWT 项目并使用当前的 GWT-RPC REST 请求?

在 GWT 中,我们如何在 javascript 和 java 之间共享对象?

java.lang.ClassNotFoundException: com.google.gwt.user.client.rpc.RemoteService