0

私はGoogleAppsマーケットプレイス向けの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 エディションにいくつかの変更を加えることで、GWT を使用してガジェット内で Restlet リソースを機能させることができました。

  • 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 に答える