1

我正在尝试使用 JSOPRequestBuilder 从 GWT 调用 Restful WS。我有一个在链接中报告的类似问题

http://groups.google.com/group/google-web-toolkit/browse_thread/thread/ef93383aca7a3dfc/d4dc5bad1a9110ea

但是,我想不出解决方案。请尽早帮助我。

我来自服务器的 JAX-WS 资源代码片段

 @GET
   @Produces(MediaType.APPLICATION_JSON)
   public DealerAddress getDealerAddress(@QueryParam("dealerId") String sDealerId) {

       DealerAddress dlrAd = new DealerAddress("test", "test", "test", "test", 10, new Date(), new Date());
       return dlrAd;
   }

Jersey 返回一个 DealerAddress 的 JSON 对象。

现在当我在浏览器中尝试请求时,rest URL "https://127.0.0.1:8181/application/rest/OrderManagementResource?alt=json-in-script&dealerId=DLR1" 工作得很好。

它甚至适用于 GWT 的 RequestBuilder 方法,但不适用于 JSONPRequestBuilder 方法。

使用 JSONPRequestBuilder 从 GWT 调用 WS 的代码片段

JsonpRequestBuilder jsonPReqBuilder = new JsonpRequestBuilder();        
jsonPReqBuilder.setTimeout(100000);
        jsonPReqBuilder.setCallbackParam("callback");
        jsonPReqBuilder.requestObject("https://127.0.0.1:8181/application/rest/OrderManagementResource?alt=json-in-script&dealerId=DLR1" , new       AsyncCallback<DealerAddressJSON>() {

            @Override
            public void onFailure(Throwable caught) {
                // TODO Auto-generated method stub
                caught.printStackTrace();
                Window.alert("Inside error"+caught.getLocalizedMessage());          
            }

            @Override
            public void onSuccess(DealerAddressJSON result) {
                // TODO Auto-generated method stub
                Window.alert("Inside success"+result);
            }

        });

其中 DealerAddressJSON 是一个 JavaScriptObject 类型类。

我可以看到我的 JAX Rest 资源被调用并说从服务器返回。

此外,我可以在 Firebug 中看到响应来自浏览器但失败并出现异常“未知令牌:”最后我总是得到一个超时异常。现在我有一个很大的问题,我们从 JAX-RS 资源返回 JSON 的方式是服务器中的问题还是 JSONPRequestBuilder 调用过程有问题?我无法理解某些链接在此问题上解释的回调更改。

请帮助我。

4

1 回答 1

2

您可能正在发回 JSON,而 JSONPRequestBuilder 需要 JSONP。这些不是一回事。

JSON只是数据,原样使用AJAX(即RequestBuilder)发出请求,可以直接读取内容。这些请求只能向同一服务器发出。示例 JSON 数据:

{"response":"success", "items":[{"id":1}, {"id":2}]}

相比之下,JSONP 是为跨域请求而设计的,因此不仅仅是包含数据,而是将数据包装在 JavaScript 中。由于您的 JSON 服务没有将响应包装在 js 函数调用中,因此这是行不通的。JSONP 数据示例:

callback_1({"response":"success", "items":[{"id":1}, {"id":2}]})

回调随每个请求而变化,因此服务器应该根据客户端每次请求的内容更改该回调函数。

于 2012-05-16T13:40:55.717 回答