Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 提取GWT服务的结果_Java_Gwt Rpc_Google Checkout_Protocol Buffers - Fatal编程技术网

Java 提取GWT服务的结果

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

这是一个混乱、复杂的问题,但问题来了。我正在与Google Checkout进行一个集成项目,有一个Google Checkout GWT服务,它返回Checkout web界面用于将美元转换为本地货币的货币转换率。该端点位于,看着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]
请原谅这种奇怪的格式:不能完全正确地设置代码块的格式

我在网上漫游了几个小时,终于确定了
regularmmutablelist
类在番石榴图书馆(at)中。我要找的是:

  • 我在任何地方都找不到
    com.google.common.money.SimpleMoney
    com.google.common.money.CurrencyCode
    类:有人看到吗
  • GWT wire格式似乎是一个奇怪的JSON字符串。我看到谷歌集团的各种信息都在谈论有线格式的描述,但找不到潜在的信息或任何连贯的信息来让我扭转这一局面:有人能处理一个方便的参考吗?如果我至少能理解编码是什么,那么我可能不需要上面问题1中的类文件
  • 我开始在Android Market api库中漫游,我想他们一定已经完成了一些Android Market通信集成,而且他们似乎已经使用protobufs完成了。GWT/protobufs通信位是否有合适的参考

  • 这种疯狂的根本原因是,我需要能够从Google Checkout中获取常规汇率值,这样当我以外币导入销售交易时,我可以按照交易时的现行汇率进行转换。目前的结帐报告格式不提供这一点,因此大多数人最终使用与谷歌使用的汇率不匹配的替代汇率来源。这显然是Google Checkout的集成界面的一个缺点,但是如果我们开始了解Google Checkout界面的缺点,我们整个星期都会在这里。我的意图是轮询新完成的订单的结帐界面,然后请求适当的汇率表,这样我就可以近乎实时地计算出收到的付款是什么。我已经得到了投票点,但还不能完全超过汇率点。

    您看到的是GWT-RPC序列化格式。不幸的是,它没有公开记录。幸运的是,GWT是开源的,因此您可以查看源代码以了解它是如何产生的

    注意:此格式可能会在GWT版本之间更改(我知道它在2.2中会更改)。这很可能也是谷歌不记录它的一个原因——如果他们记录了,他们需要保持向后兼容

  • 您看到的类名是Google Checkout内部使用的Java类。当GWT被编译成JS时,名称会被破坏,因此您再也看不到它们了
  • 如前所述,这是GWT-RPC
  • 您试图做的是对Google内部API进行反向工程。我不会那么做,因为,a。它可能会在没有通知的情况下更改,破坏您的应用程序,b。我肯定Goog不会喜欢它,而且它可能违反了服务协议(你读过吗?)

  • 在尝试为我的应用程序创建一个批量上传应用程序内产品的脚本(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]
    
    请求是管道分隔的令牌列表,具有以下含义:

  • 7-协议版本
  • 0-标志1
    FLAG\u ELIDE\u TYPE\u name
    2
    FLAG\u RPC\u TOKEN\u include
  • 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/
    -基本URL
  • 2-
    FCCA4108CB89BFC2FEC78BA7363D4AF6
    -一些散列,在GWT源代码中引用为
    serializationPolicyStrongName
  • 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
    对象,最后一个是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