0

我正在为 Google Apps 市场开发 GWT 应用程序。我在服务器端使用带有 Restlet 的 AppEngine。客户端我使用 Restlet 的 GWT 版本。这是一个很棒的组合。我在客户端和服务器之间共享我的域对象,因此不需要 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。

是否有可能破解 Restlet GWT 客户端以通过 GadgetsIO 传递所有通信,这需要什么?非常欢迎任何指点!

K。

4

1 回答 1

0

通过对 Restlet GWT 版本进行一些更改,我设法让 Restlet 资源在使用 GWT 的小工具中工作:

  • 在 GwtClientCall 中,我将标准 GWT requestbuilder 替换为 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");
      }
    }
    
  • 在 gadgetsrequestbuilder 中,我必须进行一些更改,以便它可以传递请求中的标头:

    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;
    }
    

以后有很多用于调试的对话框,它可以工作:-)

于 2011-11-13T18:06:47.917 回答