如何重新发送GWT RequestFactory请求

7

是否有可能重新发送RequestFactory传输?我想要做类似于这样的操作:如何重新发送GWT RPC请求在使用RequestFactory时。从先前的请求中重新发送相同的有效载荷非常简单,但我还需要调用同一方法。以下是我的RequestTransport类,我希望在处理用户登录凭据请求后只需“重新激活”原始请求:

package org.greatlogic.rfexample2.client;

import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport;
/**
 * Every request factory transmission will pass through the single instance of this class. This can
 * be used to ensure that when a response is received any global conditions (e.g., the user is no
 * longer logged in) can be handled in a consistent manner.
 */
public class RFERequestTransport extends DefaultRequestTransport {
//--------------------------------------------------------------------------------------------------
private IClientFactory _clientFactory;
//==================================================================================================
private final class RFERequestCallback implements RequestCallback {
private RequestCallback _requestCallback;
private RFERequestCallback(final RequestCallback requestCallback) {
  _requestCallback = requestCallback;
} // RFERequestCallback()
@Override
public void onError(final Request request, final Throwable exception) {
  _requestCallback.onError(request, exception);
} // onError()
@Override
public void onResponseReceived(final Request request, final Response response) {
  if (response.getStatusCode() == Response.SC_UNAUTHORIZED) {
    _clientFactory.login();
  }
  else {
    _clientFactory.setLastPayload(null);
    _clientFactory.setLastReceiver(null);
    _requestCallback.onResponseReceived(request, response);
  }
} // onResponseReceived()
} // class RFERequestCallback
//==================================================================================================
@Override
protected void configureRequestBuilder(final RequestBuilder builder) {
  super.configureRequestBuilder(builder);
} // configureRequestBuilder()
//--------------------------------------------------------------------------------------------------
@Override
protected RequestCallback createRequestCallback(final TransportReceiver receiver) {
  return new RFERequestCallback(super.createRequestCallback(receiver));
} // createRequestCallback()
//--------------------------------------------------------------------------------------------------
void initialize(final IClientFactory clientFactory) {
  _clientFactory = clientFactory;
} // initialize()
//--------------------------------------------------------------------------------------------------
@Override
public void send(final String payload, final TransportReceiver receiver) {
  String actualPayload = _clientFactory.getLastPayload();
  TransportReceiver actualReceiver;
  if (actualPayload == null) {
    actualPayload = payload;
    actualReceiver = receiver;
    _clientFactory.setLastPayload(payload);
    _clientFactory.setLastReceiver(receiver);
  }
  else {
    actualReceiver = _clientFactory.getLastReceiver();
  }
  super.send(actualPayload, actualReceiver);
} // send()
//--------------------------------------------------------------------------------------------------
}

你的代码很难读懂,但是你走在了正确的道路上,那么你尝试的问题是什么? - Thomas Broyer
我的问题是如何发起触发SC_UNAUTHORIZED响应的请求。例如,如果我有请求requestContext.getFooById(fooId).fire(...)并且此请求返回未经授权的响应,则我想再次触发此请求。我可以发送相同的有效负载,并回调到相同的接收器,但我不知道如何自动将“fire()”应用于“getFooId()”。(顺便说一句,是什么让我的代码“难以阅读”...我非常好奇?)。谢谢! - Andy King
如果您向同一接收器发送相同的有效载荷会发生什么?我猜应该可以正常工作™。(我认为您的代码缺乏缩进、缺少空行和太多无用注释使其难以阅读;这可能是个人口味问题) - Thomas Broyer
我可以发送任何请求,并通过覆盖有效载荷来调用生成有效载荷的任何内容(在这种情况下为getFooById())...是这样吗? - Andy King
谢谢你,Thomas...我会加多一些空行! 我确实是用两个空格进行缩进,而不是四个...只是个人口味问题,正如你所说。 - Andy King
是的。fire() 对代理所做的更改和方法调用进行编码(即构建有效载荷),将所有接收器组装成单个接收器,并将它们提供给 RequestTransport。只要在 SC_UNAUTHORIZED 的情况下不调用接收器,就可以原样重放请求。 - Thomas Broyer
2个回答

1

根据Thomas的建议,我尝试发送另一个请求,并仅在RequestTransport.send()方法中替换有效载荷和接收器,这起作用了。我猜测请求工厂没有保留进一步的上下文,服务器的响应足以让RF确定需要执行哪些操作来解包响应,超出了返回到RequestCallback.onResponseReceived()方法的requestresponse。如果有人有兴趣看我的代码,请告诉我,我会在这里发布。


0

这是可能的,但你有很多工作要做。

我有同样的想法。我花了大约两天时间寻找一个好的解决方案。我试图在RequestContext.java和其他类上拦截服务器调用。但如果你那样做,你必须为几乎每个gwt requestfactories的类制定自己的实现。所以我决定采用更简单的方法。

无论何时我发出一个请求,我处理响应并再次发送它。 当然你必须小心,不要陷入循环之中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接