0

我正在编写一个简单的 Google Web Toolkit 服务,它充当代理,基本上存在以允许客户端向不同的服务器进行 POST。客户端实质上使用此服务来请求 HTTP 调用。该服务只有一个异步方法调用,称为 ajax(),它应该只是转发服务器响应。我实现调用的代码如下所示:

class ProxyServiceImpl extends RemoteServiceServlet implements ProxyService {
    @Override
    public Response ajax(String data) {
        RequestBuilder rb = /*make a request builder*/
        RequestCallback rc = new RequestCallback() {
            @Override
            public void onResponseReceived(Response response) {
                /* Forward this response back to the client as the return value of 
                   the ajax method... somehow... */
            }
         };
         rb.sendRequest(data, requestCallback);
         return /* The response above... except I can't */;
    }
}

当然,您可以看到我的问题的基本形式。ajax() 方法是异步使用的,但 GWT 决定聪明一点,对愚蠢的老开发人员隐藏它,这样他们就可以编写没有回调的普通 Java 代码。GWT 服务基本上只是做魔术而不是接受回调参数。

那么问题就来了,因为 GWT 对我隐藏了回调对象。我正在尝试从服务实现中进行自己的异步调用,但我做不到,因为 GWT 服务假定您在服务实现中的行为是同步的。如何解决这个问题并从我的服务方法实现中进行异步调用?

4

1 回答 1

3

您正在混淆客户端和服务器端代码。在ProxyServiceImpl中,您不能使用 RequestBuilder。RequestBuilder 是一个客户端类,只能在浏览器中执行。

服务器到服务器的 http 调用始终是同步的。您应该使用HttpClient之类的库,而不是使用 RequestBuilder,获取结果,然后将其发送回客户端。这将解决您面临的问题。

但我应该补充一点,您不想在应用程序级别构建代理。您也可以使用 http 代理,例如apache 的 mod_proxy

于 2010-06-07T03:17:53.247 回答