Java 提取GWT服务的结果
这是一个混乱、复杂的问题,但问题来了。我正在与Google Checkout进行一个集成项目,有一个Google Checkout GWT服务,它返回Checkout web界面用于将美元转换为本地货币的货币转换率。该端点位于,看着Firebug,我看到它将进入服务器:Java 提取GWT服务的结果,java,gwt-rpc,google-checkout,protocol-buffers,Java,Gwt Rpc,Google Checkout,Protocol Buffers,这是一个混乱、复杂的问题,但问题来了。我正在与Google Checkout进行一个集成项目,有一个Google Checkout GWT服务,它返回Checkout web界面用于将美元转换为本地货币的货币转换率。该端点位于,看着Firebug,我看到它将进入服务器: 7|0|6|https://market.android.com/publish/gwt/|FCCA4108CB89BFC2FEC78BA7363D4AF6|com.google.wireless.android.vending
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]
请原谅这种奇怪的格式:不能完全正确地设置代码块的格式
我在网上漫游了几个小时,终于确定了regularmmutablelist
类在番石榴图书馆(at)中。我要找的是:
com.google.common.money.SimpleMoney
或com.google.common.money.CurrencyCode
类:有人看到吗这种疯狂的根本原因是,我需要能够从Google Checkout中获取常规汇率值,这样当我以外币导入销售交易时,我可以按照交易时的现行汇率进行转换。目前的结帐报告格式不提供这一点,因此大多数人最终使用与谷歌使用的汇率不匹配的替代汇率来源。这显然是Google Checkout的集成界面的一个缺点,但是如果我们开始了解Google Checkout界面的缺点,我们整个星期都会在这里。我的意图是轮询新完成的订单的结帐界面,然后请求适当的汇率表,这样我就可以近乎实时地计算出收到的付款是什么。我已经得到了投票点,但还不能完全超过汇率点。您看到的是GWT-RPC序列化格式。不幸的是,它没有公开记录。幸运的是,GWT是开源的,因此您可以查看源代码以了解它是如何产生的 注意:此格式可能会在GWT版本之间更改(我知道它在2.2中会更改)。这很可能也是谷歌不记录它的一个原因——如果他们记录了,他们需要保持向后兼容
在尝试为我的应用程序创建一个批量上传应用程序内产品的脚本(CSV上传不断失败,错误消息模糊)时,我已经理解了GWT AJAX协议 它实际上相当简单,只是它要求您知道所有使用的类的结构。或者猜猜看,就像谷歌使用的内部类一样。:) 我将使用问题中的示例详细解释协议
请求格式
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,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]
请求是管道分隔的令牌列表,具有以下含义:
FLAG\u ELIDE\u TYPE\u name
,2是FLAG\u RPC\u TOKEN\u include
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/
-基本URLFCCA4108CB89BFC2FEC78BA7363D4AF6
-一些散列,在GWT源代码中引用为serializationPolicyStrongName
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
,它只有一个整数字段:235java.util.ArrayList/4159755760
,它有一个整数长度字段13,后跟13个序列化列表项。请注意,其中12个是与上述对象一样序列化的CurrencyCode
对象,最后一个是backreference对象
aAux = Split(Datos, ",[")
aAux(1) = Replace(aAux(1), "],0,7]", "")
aAux(0) = Replace(aAux(0), "//OK[", "")
aAux(0) = Replace(aAux(0), "'", "")
aDescripcion = Split(aAux(1), """,""")
aValor = Split(aAux(0), ",")
InvertirArray aValor
For X = 0 To UBound(aValor)
If Not IsNumeric(aValor(X)) Then
Exit For
End If
If adescripcion(Int(aValor(X))-1) = "gov.senasa.embalajemadera.shared.domain.Pais/3238585366" Then
For Y = X + 1 To UBound(aValor)
If Int(aValor(Y)) = "" Then '- Do what you want
end if
If adescripcion(Int(aValor(Y))) = "java.lang.Integer/3438268394" Then
'- Do what you want
Next Y
End If
Next X
Public Sub InvertirArray(ByRef Arr() As String)
'- el array va tiene que empezar en 0
Dim X As Long
Dim Hasta As Long
Dim Tmp As String
If UBound(Arr) Mod 2 = 0 Then
'- Es impar
Hasta = UBound(Arr) + 1
Else
Hasta = UBound(Arr)
End If
For X = LBound(Arr) To UBound(Arr) \ 2
Tmp = Arr(X)
Arr(X) = Arr(UBound(Arr) - X)
Arr(UBound(Arr) - X) = Tmp
Next X
end sub
Public Function EncodeDateGwt(Numero As Double, Optional isDate As Boolean = False) As String
Dim s As String
Dim a As Double
Dim i As Integer
Dim u As Integer
Dim Base As String
Numero = IIf(isDate, Numero * 1000, Numero)
Base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$"
Do While Val(Numero) <> 0
a = Numero
i = 0
Do While a >= 64
i = i + 1
a = a / 64
Loop
If i <> u - 1 And u <> 0 Then EncodeDateGwt = EncodeDateGwt & String(u - i - 1, Left(Base, 1))
a = Int(a)
EncodeDateGwt = EncodeDateGwt + Mid(Base, a + 1, 1)
Numero = Numero - a * (64 ^ i)
u = i
Loop
EncodeDateGwt = EncodeDateGwt & String(i, Left(Base, 1))
End Function
Public Function DecodeDateGwt(Texto As String, Optional isDate As Boolean = False) As Long
Dim Base As String
Dim a As Integer
Base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$"
For a = 1 To Len(Texto)
DecodeDateGwt = DecodeDateGwt + (InStr(Base, Mid(Texto, a, 1)) - 1) * (Len(Base) ^ ((Len(Texto) - (a))))
Next
DecodeDateGwt = IIf(isDate, DecodeDateGwt / 1000, DecodeDateGwt)
'devuelve timestamp
End Function
Call encodegwtdate(date2unix("20/02/2016"),true)
Public Function Date2Unix(ByVal vDate As Date) As Long
Date2Unix = DateDiff("s", Unix1970, vDate)
End Function
Public Function Unix2Date(vUnixDate As Long) As Date
Unix2Date = DateAdd("s", vUnixDate, Unix1970)
End Function