GWT JSONPRequestBuilder - 浏览器控制台中出现“Unknown Token:”错误,最后有超时异常

时间:2012-05-16 13:24:35

标签: gwt rest jsonp

我正在尝试使用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对象。

现在休息网址“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中看到响应来自浏览器但是失败并出现异常“Unknown token:” 最后,我总是得到一个超时异常。 现在我很怀疑从JAX-RS资源返回JSON的方式是否是服务器中的问题 要么 JSONPRequestBuilder调用程序有问题吗?我无法理解一些链接在此问题上解释的回调更改。

请帮帮我。

1 个答案:

答案 0 :(得分: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}]})

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