我有一个`http://....../methodName
它返回一个jsonp结果,例如:
methodName(["a":"a", "b":"b"])
GWT提供了JsonpRequestBuilder类来解析jsonp。
JsonpRequestBuilder rb = new JsonpRequestBuilder();
rb.setCallbackParam("callback");
rb.requestObject("http://...../methodName", new AsyncCallback<TestJS>(){
...
});
此结构向url发出请求:
"http://...../methodName/?callback=__gwt_jsonp_P0.onSuccess"
。
我的Web服务返回一个回调,其方法名称不是__gwt_json ..... 所以gwt无法从该响应创建JavaScriptObject。 JsonpRequestBuilder也可以使用GET而不是POST。
如何实现这些目标:使用POST发送请求并修改GWT的默认回调名称。
答案 0 :(得分:8)
JSONP将不使用POST。它不是GWT限制btw。
JSONP本质上包含来自服务器的javascript文件。因此,当您进行JSONP调用时,会向DOM添加临时标记。
现在,<script>
标记始终可以发出GET请求。这是一个浏览器,而GWT对此无能为力。
如果您想进行跨域POST调用,则必须选择以下选项之一(并且它们与GWT无关)
答案 1 :(得分:0)
不幸的是,这不是JsonP的工作方式。通过向页面添加标记来进行请求,结果将传递到围绕数据的函数中 - 在您的情况下为__gwt_jsonp_P0.onSuccess
。
回调名称不会受到影响,至少在使用JsonpRequestBuilder
时 - 系统需要考虑到您可以一次发送多个请求,甚至可能发送到不同的端点。一个不允许调用者自定义回调函数名称的JsonP端点是非常不寻常的,更奇怪的是一个端点期望JsonP调用需要一个不可能的POST。
您可以使用ScriptElement
类型实现自己的JsonP客户端代码,并注册自己的全局回调以调用GWT java代码。
查看Web服务的API文档,看看是否有更好的方式与之通信,可能是在您自己的服务器上使用代理,完全避免了跨域问题。