java - 提取 GWT 服务的结果

标签 java gwt-rpc google-checkout protocol-buffers

凌乱,复杂的问题,但这里有。我正在与 Google Checkout 进行集成项目,并且有一个 Google Checkout GWT 服务可以返回 Checkout Web 界面用于将美元转换为本地货币的货币兑换率。此端点托管在 https://market.android.com/publish/gwt/ ,并盯着 Firebug,我看到这将发送到服务器:

7|0|6|https://market.android.com/publish/gwt/|FCCA4108CB89BFC2FEC78BA7363D4AF6|com.google.wireless.android.vending.developer.

shared.MerchantService|getCurrencyExchangeRates|com.google.common.money.CurrencyCode/112449834|java.util.ArrayList/4159755760

|1|2|3|4|2|5|6|5|235|6|13|5|18|5|81|5|53|5|72|5|102|5|121|5|177|5|175|5|205|5|204|5|55|5|86|-1|

这被退回
//OK[235,3,'D0JA',2,86,3,'CXXg',2,55,3,'DW2A',2,204,3,'X9NA',2,205,3,'EuvA',2,175,3,'VIig',2,177,3,'E2Dw',2,121,3,'E4ziA',2,1

02,3,'do$Q',2,72,3,'T82w',2,53,3,'Ds0Q',2,81,3,'Cq5g',2,18,3,'Dlfg',2,13,1,["com.google.common.collect.RegularImmutableList/4

40499227","com.google.common.money.SimpleMoney/627983206","com.google.common.money.CurrencyCode/112449834"],0,7]

原谅奇怪的格式:不能完全正确地格式化代码块。

在网上徘徊了几个小时,我能够确定 RegularImmutableList类在 Guava 库中(位于 http://code.google.com/p/guava-libraries/ )。我正在寻找的是:
  • 我找不到 com.google.common.money.SimpleMoneycom.google.common.money.CurrencyCode任何地方的类(class):有人见过吗?
  • GWT 有线格式似乎是一个奇怪的 JSON 字符串。我看到对 Google Groups 消息的各种引用谈论有线格式的描述,但找不到底层消息或任何可以让我扭转这一点的连贯引用:任何人都有一个方便引用的句柄?如果我至少可以理解编码是什么,那么我可能能够摆脱上述问题 1 中的类文件。
  • 我开始在 http://code.google.com/p/android-market-api/ 浏览 Android Market api 库。 ,认为他们必须完成一些 Android Market 通信集成,而且他们似乎已经使用 protobufs 完成了。 GWT/protobufs 通信位有什么像样的引用吗?

  • 这种疯狂的根本原因是我需要能够从 Google Checkout 中获取常规汇率值,因此当我导入外币销售交易时,我可以在交易时以现行汇率进行转换。当前的 Checkout 报告格式不提供此功能,因此大多数人最终使用与 Google 使用的不匹配的替代汇率来源。这显然是 Google Checkout 集成界面的一个缺点,但如果我们开始了解 Google Checkout 界面的缺点,我们将整整一周都在这里。我的目的是轮询 Checkout 界面以获取新完成的订单,然后请求适当的汇率表,以便我可以近乎实时地计算出收款金额。我已经掌握了民意调查位,但无法完全超越汇率位。

    最佳答案

    在尝试为我的应用程序创建一个批量上传应用内产品的脚本时(CSV 上传经常失败并出现模糊的错误消息),我设法理解了 GWT AJAX 协议(protocol)。

    它实际上非常简单,只是它要求您了解所有使用的类的结构。或者猜猜看,就像谷歌使用的内部类一样。 :)

    我将使用问题中的示例来详细解释协议(protocol)。

    申请格式

    7|0|6|https://market.android.com/publish/gwt/|FCCA4108CB89BFC2FEC78BA7363D4AF6|com.google.wireless.android.vending.developer.shared.MerchantService|getCurrencyExchangeRates|com.google.common.money.CurrencyCode/112449834|java.util.ArrayList/4159755760|1|2|3|4|2|5|6|5|235|6|13|5|18|5|81|5|53|5|72|5|102|5|121|5|177|5|175|5|205|5|204|5|55|5|86|-1|
    

    该请求是以管道分隔的 token 列表,具有以下含义:
  • 7 - 协议(protocol)版本
  • 0 - 旗帜。 1 FLAG_ELIDE_TYPE_NAMES , 2 FLAG_RPC_TOKEN_INCLUDED
  • 6 - 字符串标记计数
  • 6 个字符串标记:
  • https://market.android.com/publish/gwt/
  • FCCA4108CB89BFC2FEC78BA7363D4AF6
  • com.google.wireless.android.vending.developer.shared.MerchantService
  • getCurrencyExchangeRates
  • com.google.common.money.CurrencyCode/112449834
  • java.util.ArrayList/4159755760
  • 实际的编码请求,它使用基于 1 的索引引用上面列表中的字符串:
  • 1 - https://market.android.com/publish/gwt/ - 基本网址
  • 2 - FCCA4108CB89BFC2FEC78BA7363D4AF6 - 一些哈希,引用为 serializationPolicyStrongName在 GWT 源中。
  • 3 - com.google.wireless.android.vending.developer.shared.MerchantService - 服务名称
  • 4 - getCurrencyExchangeRates - 方法名称
  • 2 - 参数计数。参数类型如下:
  • 5 - com.google.common.money.CurrencyCode/112449834
  • 6 - java.util.ArrayList/4159755760
  • 序列化参数。每个对象由其类名和序列化字段列表表示,或由对先前遇到的对象的负整数反向引用表示。在我们的例子中,我们有两个对象:
  • 5 - com.google.common.money.CurrencyCode/112449834 ,它只有一个整数字段: 235
  • 6 - java.util.ArrayList/4159755760 ,它有一个整数长度字段 13 ,后跟 13 个序列化列表项。请注意,其中 12 个是 CurrencyCode像上面那样序列化的对象,最后一个是对我们在(反)序列化此请求时遇到的第一个对象的反向引用( -1 ),即 CurrencyCode(235)


  • 回复格式
    //OK[235,3,'D0JA',2,86,3,'CXXg',2,55,3,'DW2A',2,204,3,'X9NA',2,205,3,'EuvA',2,175,3,'VIig',2,177,3,'E2Dw',2,121,3,'E4ziA',2,102,3,'do$Q',2,72,3,'T82w',2,53,3,'Ds0Q',2,81,3,'Cq5g',2,18,3,'Dlfg',2,13,1,["com.google.common.collect.RegularImmutableList/440499227","com.google.common.money.SimpleMoney/627983206","com.google.common.money.CurrencyCode/112449834"],0,7]
    

    响应在格式上与请求非常相似,除了它是 JS 格式的数组(虽然不是 JSON,因为它使用了无效的单引号),它是 以相反的顺序 .
    字段含义如下:
  • 7 - 协议(protocol)版本
  • 0 - 标志,与请求
  • 相同
  • 字符串标记数组:
  • com.google.common.collect.RegularImmutableList/440499227
  • com.google.common.money.SimpleMoney/627983206
  • com.google.common.money.CurrencyCode/112449834
  • 然后是一个 类型的序列化对象1 - com.google.common.collect.RegularImmutableList/440499227具有一个整数长度字段 13 ,后跟 类的 13 个序列化对象2 - com.google.common.money.SimpleMoney/627983206 .每个SimpleMoney对象有两个字段,例如:
  • 'Dlfg' - 编码为 base64 数字的长整数字段。这个特别的是 940000
  • 3, 18 - CurrencyCode具有整数字段的对象 18
  • 关于java - 提取 GWT 服务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6063012/

    相关文章:

    python - 如何用 Django 实现一个简单的 Google Checkout 回调函数?

    java - 当限制设置为 20 时,Facebook Graph API 会响应任何数据

    java - 在 Java 中将 Epoch 秒转换为日期和时间格式

    java - 在执行其他方法或代码之前完成 RPC 调用?

    apache - 部署 GWT 和 HTML 应用程序

    android - 测试 Android inapp 订阅 : You already own this subscription

    java - 获取前一天

    java - 使用 FileUpload 提交表单后,GWT 的 SubmitCompleteEvent 的 getResults() 返回 null

    java - GWT 模块继承并且应用程序运行时没有可用的源代码