2011-11-02 6 views
0

Google Apps 마켓 플레이스 용 GWT 앱을 개발 중입니다. 서버 측에서 Restlet과 함께 AppEngine을 사용하고 있습니다. 클라이언트 측 Restlet의 GWT 에디션을 사용합니다. 이것은 훌륭한 조합입니다. 내 도메인 개체를 클라이언트와 서버간에 공유 할 수 있으므로 DTO 또는 프록시 등이 필요하지 않습니다. 클라이언트 측에서 단순히 Restlet 프레임 자원을 호출 할 수 있습니다 :Google Gadget의 Restlet GWT

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

을 기본 XML을 구문 분석 또는 수신 JSON을 해석하는 JSNI를 사용할 필요가 없습니다.

그러나 앱의 일부는 GMAIL 문맥 가젯이며, 가젯과 서버 간의 모든 통신이 GadgetsIO makeRequest를 통과해야하기 때문에 위 코드를 사용할 수 없습니다.

가젯의 경우 XML을 구문 분석하거나 JSNI를 사용하여 들어오는 JSON을 해석해야합니다.

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/ co.kr/google/gwt/gadgets/client/rpc /? r = 1792? – koma

답변

0
내가으로 Restlet 자원이으로 Restlet GWT 판을 일부 변경하여 GWT를 사용하여 가젯 내에서 작동하도록 얻을 수 있었다

:

    GwtClientCall에서

    나는에 의해 표준 GWT의 requestbuilder 교체

  • GadgetRequestBuilder이 같은 (것 IoProvider.makeRequest한다), 상기 gadgetsrequestbuilder에서

    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"); 
        } 
    } 
    
  • 는 좀했습니다

    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