首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪造GWT同步RPC调用

伪造GWT同步RPC调用
EN

Stack Overflow用户
提问于 2012-01-05 00:10:53
回答 3查看 6.9K关注 0票数 5

首先,我知道做同步调用是“错误的”,也知道“不可能”。

但是,在非常复杂的情况下(我不知道如何解释),我需要等待来自服务器的响应,我使用GWT-Platform命令实现GWT RPC调用。

我在找某种“黑客”来做这件事。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-05 01:23:10

有一个解决方案,但它并不容易(例如,您不能翻转单个参数来使其工作)。GWT在幕后使用普通的JS XMLHttpRequest。在GWT中,有一种称为com.google.gwt.xhr.client.XMLHttpRequest的覆盖类型。此类用于通过HTTP向服务器发送请求。每个JS XMLHttpRequest首先通过调用open方法进行初始化。这个方法有几个参数,但是第三个参数指定请求是否应该是异步的。如果您将其更改为false,则请求将是同步的。

但是GWT-RPC没有直接使用这个类,它通过RpcRequestBuilder使用它,而且这个类也没有直接使用XMLHttpRequest,它使用的是RequestBuilder。

因此,您需要做的是创建RpcRequestBuilder和RequestBuilder的自定义版本(将使用初始化为同步的XMLHttpRequest )。

您可以通过将GWT-RPC服务实例转换为ServiceDefTarget来设置RPCRequest构建器。

您是否仍然希望拥有同步的GWT-RPC请求?

票数 5
EN

Stack Overflow用户

发布于 2012-01-05 00:53:25

通常,通过处理RPC请求的onSuccess()函数中的内容,您将自动“等待来自服务器的响应”。所以我假设你想阻止当前正在运行的所有代码?由于JavaScript是单线程的,这并不容易,所以没有休眠功能来暂停程序。

但是,使用计时器的黑客可能会执行您想要的操作:

代码语言:javascript
复制
    Timer checkRPCResponse = new Timer() {
        @Override
        public void run() {
            if (!serverResponseReceived) {
                this.schedule(100);
            } else {
                proceedWithProgram();
            }
        }
    };
    checkRPCResponse.schedule(100);

我还没有在上面的例子中尝试过this.schedule(100)是否工作,但是您已经明白了,这是一个检查服务器是否每隔100ms响应一次的检查。当然,您必须在onSuccess()函数中自己设置serverResponseReceived = true。在RPC之后立即调用计时器。

票数 8
EN

Stack Overflow用户

发布于 2016-11-15 21:13:31

GWT调用XMLHttpRequest.open(),第三个参数为true,这意味着调用将是异步的。出于测试目的,我解决了类似的需求,只是强制第三个参数始终为false:

代码语言:javascript
复制
private static native void fakeXMLHttpRequestOpen() /*-{
   var proxied = $wnd.XMLHttpRequest.prototype.open;

   (function() {
       $wnd.XMLHttpRequest.prototype.open =
           function() {
                arguments[2] = false;
                return proxied.apply(this, [].slice.call(arguments));
            };
        })();
}-*/;

在调用fakeXMLHttpRequestOpen()之后,任何对XMLHttpRequest的进一步使用都将同步执行。例如:

代码语言:javascript
复制
remoteSvc.getResult(new AsyncCallback<String>() {
    @Override
    public void onSuccess(String result) {
        GWT.log("Service called!");
    }

    @Override
    public void onFailure(Throwable caught) {
        GWT.log("Service failed...");
    }
}

GWT.log("Last message");

将始终呈现:

代码语言:javascript
复制
Service called!
Last message

请参阅XMLHttpRequest.open()规范的https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8729994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档