RequestFactory и автономные клиенты

Я пытаюсь создать приложение, которое может работать, даже когда сеть не работает. Идея состоит в том, чтобы хранить данные, возвращенные из RequestFactory, в localStorage и использовать localStorage, когда сеть недоступна. Моя проблема - я не уверен, как именно различать ошибки сервера (5XX, 4XX, ...) и сетевые ошибки. (Я предполагаю, что в обоих случаях будет вызываться мой Receiver.onFailure(), но я до сих пор не знаю, как идентифицировать эту ситуацию)

Любая помощь будет оценена по достоинству,

Спасибо, Гилад.


person Gilad    schedule 08.03.2012    source источник


Ответы (1)


Код ответа при отсутствии подключения к интернету равен 0.

С помощью RequestFactory, чтобы определить, что запрос был неудачным из-за сети, необходимо получить доступ к коду ответа. RequestTransport кажется лучшим местом.

Вот примерная реализация OfflineAwareRequestTransport.

   public class OfflineAwareRequestTransport extends DefaultRequestTransport {

  private final EventBus eventBus;
  private boolean online = true;

  public OfflineAwareRequestTransport(EventBus eventBus) {
    this.eventBus = eventBus;
  }

  @Override
  public void send(final String payload, final TransportReceiver receiver) {

    // super.send(payload, proxy);
    RequestBuilder builder = createRequestBuilder();
    configureRequestBuilder(builder);

    builder.setRequestData(payload);
    builder.setCallback(createRequestCallback(receiver, payload));
    try {
      builder.send();
    } catch (RequestException e) {
    }
  }

  protected static final int SC_OFFLINE = 0;

  protected RequestCallback createRequestCallback(final TransportReceiver receiver,
      final String payload) {

    return new RequestCallback() {

      public void onError(Request request, Throwable exception) {
        receiver.onTransportFailure(new ServerFailure(exception.getMessage()));
      }

      public void onResponseReceived(Request request, Response response) {
        if (Response.SC_OK == response.getStatusCode()) {
          String text = response.getText();
          setOnline(true);
          receiver.onTransportSuccess(text);
        } else if (response.getStatusCode() == SC_OFFLINE) {
          setOnline(false);
          boolean processedOk = processPayload(payload);
          receiver.onTransportFailure(new ServerFailure("You are offline!", OfflineReceiver.name,
              "", !processedOk));
        } else {
          setOnline(true);
          String message = "Server Error " + response.getStatusCode() + " " + response.getText();
          receiver.onTransportFailure(new ServerFailure(message));
        }
      }

    };
  }
person Nick Siderakis    schedule 13.10.2012