Рестлет GWT в гаджете Google - PullRequest
       40

Рестлет GWT в гаджете Google

0 голосов
/ 03 ноября 2011

Я занимаюсь разработкой приложения GWT для магазина Google Apps. Я использую AppEngine с Restlet на стороне сервера. На стороне клиента я использую GWT версию Restlet. Это отличное сочетание. У меня есть общие доменные объекты между клиентом и сервером, поэтому нет необходимости в DTO, прокси и т. Д. На стороне клиента я могу просто вызвать ресурсы Restlet:

CustomerResourceProxy customerResource = GWT.create(CustomerResourceProxy.class);
customerResource.getClientResource().setReference("/customer");
customerResource.retrieve(new Result<Customer>() { .... }

Нет необходимости анализировать базовый XML или использовать JSNI для интерпретации входящего JSON.

НО ... частью приложения является контекстный гаджет GMAIL, и я не могу просто использовать приведенный выше код, потому что вся связь между гаджетом и сервером должна проходить через GadgetsIO makeRequest.

Так что ... просто для гаджета, мне придется приложить усилия для разбора XML или использования JSNI для интерпретации входящего JSON.

Возможно ли überhaupt взломать GWT-клиент Restlet для передачи всего сообщения через GadgetsIO и что для этого потребуется? Любые указатели очень приветствуются!

1012 * К. *

1 Ответ

0 голосов
/ 13 ноября 2011

Мне удалось заставить ресурсы Restlet работать внутри гаджета с помощью GWT, внеся некоторые изменения в редакцию Restlet GWT:

  • В GwtClientCall я заменил стандартный построитель запросов GWT на GadgetRequestBuilder (который будет IoProvider.makeRequest), например:

    public GwtClientCall(GwtHttpClientHelper helper, String method, String requestUri, boolean hasEntity) {
      super(helper, method, requestUri);
      Reference requestRef = new Reference(requestUri);
      if (requestRef.isRelative() || requestRef.getScheme().startsWith("http")) {
       this.requestBuilder = new GadgetsRequestBuilder(method, requestUri);
       this.requestBuilder.setTimeoutMillis(getHelper().getSocketConnectTimeoutMs());
       this.responseHeadersAdded = false;
      } else {
       throw new IllegalArgumentException("Only HTTP or HTTPS resource URIs are allowed here");
      }
    }
    
  • В gadgetsrequest Builder мне пришлось внести некоторые изменения, чтобы он передавал заголовки в запросе:

    private GadgetsRequest doSend(String requestData, final RequestCallback callback) throws RequestException {
    
    final RequestOptions options = RequestOptions.newInstance();
    options.setMethodType(methodType);
    if (requestData != null && requestData.length() > 0) {
        options.setPostData(requestData);
    }
    options.setAuthorizationType(AuthorizationType.SIGNED);
    options.setContentType(ContentType.DOM);
    setHeaders(options);
    
    final GadgetsRequest gadgetsRequest = new GadgetsRequest(getTimeoutMillis(), callback);
    gadgetsRequest.setPending(true);
    
    IoProvider.get().makeRequest(getUrl(), new ResponseReceivedHandler<Object>() {
        public void onResponseReceived(ResponseReceivedEvent<Object> event) {
            gadgetsRequest.fireOnResponseReceived(event, callback);
        }
    
    }, options);
    
    return gadgetsRequest;
    }
    
  • контейнер гаджетов по умолчанию удаляет заголовки ответа, поэтому я вручную добавляю MediaType.APPLICATION_JAVA_OBJECT_GWT

    @Override
    public Series<org.restlet.client.engine.header.Header> getResponseHeaders() {
    final Series<org.restlet.client.engine.header.Header> result = super.getResponseHeaders();
    if (!this.responseHeadersAdded && (getResponse() != null)) {
        Header[] headers = getResponse().getHeaders();
        for (int i = 0; i < headers.length; i++) {
            if (headers[i] != null) {
                result.add(headers[i].getName(), headers[i].getValue());
            }
        }
        result.add(HeaderConstants.HEADER_CONTENT_TYPE, MediaType.APPLICATION_JAVA_OBJECT_GWT.toString());
        this.responseHeadersAdded = true;
    }
    
    return result;
    }
    

Множество диалоговых окон для последующей отладки, работает: -)

...