GWT JSONPRequestBuilder-“;未知标记:“未知标记”;浏览器控制台中出错,末尾出现超时异常

GWT JSONPRequestBuilder-“;未知标记:“未知标记”;浏览器控制台中出错,末尾出现超时异常,gwt,rest,jsonp,Gwt,Rest,Jsonp,我试图使用JSOPRequestBuilder从GWT调用Restful WS。我有一个类似的问题,这是报告中的链接 但是,我想不出解决办法。请尽早帮助我 来自服务器的我的JAX-WS资源代码片段 Jersey返回DealerAddress的JSON对象 现在使用rest URL“https://127.0.0.1:8181/application/rest/OrderManagementResource?alt=json-在脚本中&dealerId=DLR1“ 当我在浏览器中尝试请求时,效

我试图使用JSOPRequestBuilder从GWT调用Restful WS。我有一个类似的问题,这是报告中的链接

但是,我想不出解决办法。请尽早帮助我

来自服务器的我的JAX-WS资源代码片段
Jersey返回DealerAddress的JSON对象

现在使用rest URL“https://127.0.0.1:8181/application/rest/OrderManagementResource?alt=json-在脚本中&dealerId=DLR1“ 当我在浏览器中尝试请求时,效果绝对良好

它甚至可以使用GWT中的RequestBuilder方法,但不能使用JSONPRequestBuilder方法

使用JSONPRequestBuilder从GWT调用WS的代码段
JsonpRequestBuilder jsonPReqBuilder=newjsonprequestbuilder();
jsonPReqBuilder.setTimeout(100000);
jsonPReqBuilder.setCallbackParam(“回调”);
jsonPReqBuilder.requestObject(“https://127.0.0.1:8181/application/rest/OrderManagementResource?alt=json-在script&dealerId=DLR1中,新建AsyncCallback(){
@凌驾
失败时的公共无效(可丢弃){
//TODO自动生成的方法存根
已捕获。printStackTrace();
alert(“内部错误”+捕获的.getLocalizedMessage());
}
@凌驾
成功时公共无效(DealerAddressJSON结果){
//TODO自动生成的方法存根
Window.alert(“内部成功”+结果);
}
});

其中as DealerAddressJSON是一个JavaScriptObject类型的类

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

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


请帮助我。

您可能正在发回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}]})

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

正如您所说,RequestBuilder工作正常。但我想摆脱SOP限制,使用JSONPRequestBuilder。另外,我知道返回类型不是有问题的JSONP类型。我无法理解如何将来自服务器的响应修改为具有回调功能的JSONP格式。关于我的代码,请告诉我回调所需的更改。另外,如果我们将服务器更改为返回JSONP,这不会成为服务器和GWT客户端之间的紧密耦合。如果我们有一个不同的客户机(不是GWT),并且希望使用来自服务器的相同rest服务,我们是否需要重写服务器更改?因为,服务器响应JSONP应该由所有不同的客户端处理,rt.JSON不是JSONP,它们不能以相同的方式使用-服务器响应几乎是一样的,但绕过SOP的技巧必须存在,浏览器才能接受它-您故意绕过SOP,这是一种安全特性。标准方法通常是以某种方式区分两者,可能使用
.json
vs
.jsonp
后缀。JSONP只能使用GET请求,并且必须包含有效的JavaScript,而XHR则更加灵活,即使您将其限制为仅包含JSON。
{"response":"success", "items":[{"id":1}, {"id":2}]}
callback_1({"response":"success", "items":[{"id":1}, {"id":2}]})