2011-11-02 34 views
0

我正在爲Google Apps市場開發GWT應用程序。我在服務器端使用帶Restlet的AppEngine。客戶端我使用Restlet的GWT版本。這是一個很好的組合。我有我的域對象在客戶端和服務器之間共享,因此不需要DTO或代理等等。在客戶端,我可以簡單地調用的Restlet資源:Google小工具中的Restlet GWT

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是否有可能破解Restlet GWT客戶端以通過GadgetsIO傳遞所有通信,需要什麼?任何指針非常歡迎!

K.

+0

PUT,GET,POST,HEAD都支持該規範,請參閱http://opensocial-resources.googlecode.com/svn/spec/2.0/Core-Gadget。 XML#gadgets.io。可以將響應作爲TEXT和響應標題進行檢索。我相信,小工具容器/代理會過濾一些請求頭。 – koma

+0

如果我從Restlet GWT版本中替換了RequestBuilder和朋友,並將其替換爲其小工具副本http://code.google.com/p/gwt-google-apis/source/browse/trunk/gadgets/gadgets/src/ com/google/gwt/gadgets/client/rpc /?r = 1792? – koma

回答

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

很多對話框用於以後調試,它可以工作:-)

+0

有人幫我佈置這個答案有點? – koma

+0

管理修復佈局 – koma

+0

原來不能在FF上工作,但在Chrome上工作...需要考慮這一點。 – koma