GWT JSONP与帖子没有得到

时间:2011-07-25 12:11:05

标签: gwt post jsonp

我有一个`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的默认回调名称。

2 个答案:

答案 0 :(得分:8)

JSONP将使用POST。它不是GWT限制btw。

JSONP本质上包含来自服务器的javascript文件。因此,当您进行JSONP调用时,会向DOM添加临时标记。

现在,<script>标记始终可以发出GET请求。这是一个浏览器,而GWT对此无能为力。

如果您想进行跨域POST调用,则必须选择以下选项之一(并且它们与GWT无关)

  • 使用Flash加上允许跨域帖子的crossdomain.xml
  • 使用跨源资源共享或CORS。请注意,这仅适用于现代浏览器
  • 在您的域中使用代理服务器

答案 1 :(得分:0)

不幸的是,这不是JsonP的工作方式。通过向页面添加标记来进行请求,结果将传递到围绕数据的函数中 - 在您的情况下为__gwt_jsonp_P0.onSuccess

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

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

查看Web服务的API文档,看看是否有更好的方式与之通信,可能是在您自己的服务器上使用代理,完全避免了跨域问题。