GWT使用JSONP进行Post请求而非Get请求

4
我有一个 Web 服务,形式为 `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 方法发送请求,并修改 GWT 默认的回调函数名。
2个回答

8
JSONP无法使用POST方法。这不是GWT的限制。
JSONP本质上是从您的服务器包含一个javascript文件。因此,当您进行JSONP调用时,会向DOM添加一个临时标签。
现在,<script>标记总是可以发出GET请求。这是浏览器的事情,GWT无法做太多事情。
如果您想进行跨域POST调用,则必须从以下选项中选择一个(它们与GWT无关):
- 使用Flash加上允许跨域POST的crossdomain.xml - 使用跨域资源共享或CORS。请注意,这仅受现代浏览器支持。 - 在您的域上使用代理服务器。

0

很遗憾,这不是JsonP的工作方式。请求是通过向页面添加标签来完成的,并且结果被传递到包装在数据周围的函数中 - 在您的情况下,是__gwt_jsonp_P0.onSuccess

回调名称无法受到影响,至少在使用JsonpRequestBuilder时如此 - 系统需要考虑到您可能同时发送多个请求,甚至可能发送到不同的端点。不允许调用方自定义回调函数名称的JsonP端点非常不寻常,而期望JsonP调用的端点期望一个不可能的POST更加奇怪。

您可以通过使用ScriptElement类型实现自己的JsonP客户端代码,并注册自己的全局回调以调用您的GWT Java代码。

查看Web服务的API文档,看看是否有更好的通信方式,例如通过在自己的服务器上使用代理来完全避免跨域问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接