我正在编写一个简单的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服务假设您在服务实现中表现同步。我该如何解决这个问题并从我的服务方法实现中进行异步调用?
答案 0 :(得分:3)
您正在混淆客户端和服务器端代码。在ProxyServiceImpl
中,您无法使用RequestBuilder。 RequestBuilder是一个客户端类,只能在浏览器中执行。
服务器到服务器的http调用始终是同步的。您应该使用像HttpClient之类的库,而不是使用RequestBuilder,获取结果,然后将其发送回客户端。这将解决您面临的问题。
但是我应该补充一点,你不想在应用程序级别构建代理。您也可以使用apache's mod_proxy之类的http代理。