反序列化 Google Web Kit 响应 (Java) 和 Java Servlet

Deserialize Google Web Kit Response (Java) and Java Servlets

我有一个单一的遗留应用程序,我需要读取数据并向其提交数据。它使用 Google Web Kit 和 Java Servlet。 我可以访问源代码,但我对 Servlet 和 GWT 都不熟悉。

我正在尝试在我的项目中封装一个休息客户端,它可以与 GET/POST 对遗留服务器的休息调用进行通信。

我已经能够使用 Postman 发送 POST 请求,然后使用 Reactive Spring 5.0 框架发送该请求。

当我尝试反序列化响应时,我 运行 遇到了很多错误。

我将如何反序列化此负载?

7|0|7|http://localhost:8080/testproject/
|29F4EA1240F157649C12466F01F46F60|
com.test.client.GreetingService|greetServer|java.lang.String|
myInput1|myInput2|1|2|3|4|2|5|5|6|7|

我搜索了一整天,关注了一些这样的博客: https://docs.google.com/document/d/1eG0YocsYYbNAtivkLtcaiEE5IOF5u4LUol8-LL0TIKU/edit# https://blog.gdssecurity.com/labs/2009/10/8/gwt-rpc-in-a-nutshell.html

我不确定如何通过代码将它们序列化到我自己的新服务对象中。

static WebClient webClient = WebClient.create();

public static void main(String[] args) {

    Mono<String> body = Mono.just("7|0|7|http://localhost:8080/testproject/|29F4EA1240F157649C12466F01F46F60|com.test.client.GreetingService|greetServer|java.lang.String|myInput1|myInput2|1|2|3|4|2|5|5|6|7|");

    Mono<String> response = webClient.post()
            .uri("http://localhost:8080/testproject/")
            .header("Content-Type", "text/x-gwt-rpc;charset=UTF-8")
            .header("X-GWT-Module-Base", "http://localhost:8080/testproject/")
            .header("X-GWT-Permutation", "29F4EA1240F157649C12466F01F46F60")
            .cookie("JSESSIONID", "2BCEBF12GE2C3A0335F5012812A73638")
            .body(body, String.class)
            .retrieve()
            .bodyToMono(String.class);

    String unBlocked = response.block();

    System.out.println(unBlocked);
    //OK[1,1,["java.lang.Integer/3438228391"],0,2]

    try {
    ServerSerializationStreamReader streamReader = new ServerSerializationStreamReader(
        Thread.currentThread().getContextClassLoader(), null);
        streamReader.prepareToRead(unBlocked);
        System.out.println(streamReader.readObject());
    } catch ( Exception e) {
        e.printStackTrace();
    }
}

错误: com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: 此应用程序已过期,请单击浏览器上的刷新按钮。 (收到格式错误或旧的 RPC 消息 - 期望版本介于 5 和 7 之间)

由于格式错误的 RCP 消息,我尝试了每个版本的 GWT。 另外,我试图将它插入一个字符串中,我确信它自己会失败。

您正在尝试使用意味着解码客户端请求的代码来解码服务器响应。由于历史原因,目前他们使用不同的格式 - 请注意响应如何以“//OK”开头,但请求以 version/flags/stringcount“7|0|7”开头。

至少有一小部分是因为当客户端调用服务器时,它需要描述它正在使用的版本以及服务器应该在哪里找到列出 classes 集合的文件允许客户期望被序列化。当服务器响应时,由于客户端已经告诉它可以序列化的类型,所以它不需要再次告诉客户端同样的事情。

阅读 com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader class 及其文档将显示响应格式以及如何将其解码为对象。据我所知,目前没有服务器端代码旨在完成这项工作,但编写起来可能难度很小,只是需要一些坚持。