凌乱,复杂的问题,但这里有。我正在与 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.SimpleMoney
或 com.google.common.money.CurrencyCode
任何地方的类(class):有人见过吗? 这种疯狂的根本原因是我需要能够从 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 列表,具有以下含义:
FLAG_ELIDE_TYPE_NAMES
, 2 是 FLAG_RPC_TOKEN_INCLUDED
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
https://market.android.com/publish/gwt/
- 基本网址 FCCA4108CB89BFC2FEC78BA7363D4AF6
- 一些哈希,引用为 serializationPolicyStrongName
在 GWT 源中。 com.google.wireless.android.vending.developer.shared.MerchantService
- 服务名称 getCurrencyExchangeRates
- 方法名称 com.google.common.money.CurrencyCode/112449834
java.util.ArrayList/4159755760
com.google.common.money.CurrencyCode/112449834
,它只有一个整数字段: 235 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,因为它使用了无效的单引号),它是 以相反的顺序 .
字段含义如下:
com.google.common.collect.RegularImmutableList/440499227
com.google.common.money.SimpleMoney/627983206
com.google.common.money.CurrencyCode/112449834
com.google.common.collect.RegularImmutableList/440499227
具有一个整数长度字段 13 ,后跟 类的 13 个序列化对象2 - com.google.common.money.SimpleMoney/627983206
.每个SimpleMoney
对象有两个字段,例如:'Dlfg'
- 编码为 base64 数字的长整数字段。这个特别的是 940000 CurrencyCode
具有整数字段的对象 18 关于java - 提取 GWT 服务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6063012/