从不同的 url 启动应用程序时 GWT RPC 失败
GWT RPC fails when launching app from different urls
我正在使用 urls 导航到我的 GWT 应用程序中的不同屏幕。例如:
http://127.0.0.1/home
http://127.0.0.1/info/contact-us
http://127.0.0.1/app/index.html
我有一个服务于 html 的 servlet,其中包含 GWT 所需的脚本元素(我的 GWT 模块名称是 "app"):
<script type="text/javascript" language="javascript" src="/app/app.nocache.html">
</script>
这与 GWT 2.6.1 配合得很好。 在浏览器开发工具中,可以看到在 [=16] 处对我的 RemoteService
进行了 RPC 调用=]
问题是当我升级到 GWT 2.8 时,我的应用程序的 RPC 调用端点现在不同且错误,具体取决于所使用的 URL。例如:
http://127.0.0.1/home -> http://127.0.0.1/rpc
http://127.0.0.1/info/contact-us -> http://127.0.0.1/info/rpc
http://127.0.0.1/app/index.html -> http://127.0.0.1/app/rpc
对于上述 URLs,模块始终正确加载和执行,但 RPC 在前两种情况下失败。只有最后一个 URL 允许我的应用进行 RPC 调用。
可以通过将 client-side 服务代理转换为 ServiceDefTarget
并使用 setServiceEntryPoint()
来设置 RPC 端点。如下:
ourInstance = (MyRemoteServiceAsync)GWT.create(MyRemoteService.class);
ServiceDefTarget serviceDefTarget = (ServiceDefTarget) ourInstance;
serviceDefTarget.setServiceEntryPoint("/app/rpc");
但是,请求负载仍然包含对不正确模块库的引用。在 RPC 请求上发送的 http headers 也有不正确的值:
X-GWT-Module-Base:http://127.0.0.1/foo/bar/
有没有办法强制客户端的RPC机制使用正确的RPCURL/app/rpc
?或者也许是一种正确设置 module-base 的方法?
更新 1
在 GWT 2.7 中看到相同的行为。
此外,当部署在 WAR 中时,<module-hash>.cache.js
文件不会加载,因为它也是相对于 url 请求的。这非常糟糕,因为这意味着模块代码不会被缓存,因为这个 url 每次都不一样。需要在选择器 <module>.nocache.js
中进行修复。 在现实世界中,是否有人实际使用带有 url 链接的 GWT?
通过在 html 文档的 <head>
元素中指定一个 <meta>
元素,bootstrap nocache.js 选择器 javascript 将选择正确的模块 baseUrl。 baseUrl 必须是完全指定的绝对 url,并以 /
.
结尾
对于我的示例,确切的元素是:
<head>
...
<meta name="gwt:property" content="baseUrl=http://127.0.0.1/app/" />
...
</head>
我正在使用 urls 导航到我的 GWT 应用程序中的不同屏幕。例如:
http://127.0.0.1/home
http://127.0.0.1/info/contact-us
http://127.0.0.1/app/index.html
我有一个服务于 html 的 servlet,其中包含 GWT 所需的脚本元素(我的 GWT 模块名称是 "app"):
<script type="text/javascript" language="javascript" src="/app/app.nocache.html">
</script>
这与 GWT 2.6.1 配合得很好。 在浏览器开发工具中,可以看到在 [=16] 处对我的 RemoteService
进行了 RPC 调用=]
问题是当我升级到 GWT 2.8 时,我的应用程序的 RPC 调用端点现在不同且错误,具体取决于所使用的 URL。例如:
http://127.0.0.1/home -> http://127.0.0.1/rpc
http://127.0.0.1/info/contact-us -> http://127.0.0.1/info/rpc
http://127.0.0.1/app/index.html -> http://127.0.0.1/app/rpc
对于上述 URLs,模块始终正确加载和执行,但 RPC 在前两种情况下失败。只有最后一个 URL 允许我的应用进行 RPC 调用。
可以通过将 client-side 服务代理转换为 ServiceDefTarget
并使用 setServiceEntryPoint()
来设置 RPC 端点。如下:
ourInstance = (MyRemoteServiceAsync)GWT.create(MyRemoteService.class);
ServiceDefTarget serviceDefTarget = (ServiceDefTarget) ourInstance;
serviceDefTarget.setServiceEntryPoint("/app/rpc");
但是,请求负载仍然包含对不正确模块库的引用。在 RPC 请求上发送的 http headers 也有不正确的值:
X-GWT-Module-Base:http://127.0.0.1/foo/bar/
有没有办法强制客户端的RPC机制使用正确的RPCURL/app/rpc
?或者也许是一种正确设置 module-base 的方法?
更新 1
在 GWT 2.7 中看到相同的行为。
此外,当部署在 WAR 中时,<module-hash>.cache.js
文件不会加载,因为它也是相对于 url 请求的。这非常糟糕,因为这意味着模块代码不会被缓存,因为这个 url 每次都不一样。需要在选择器 <module>.nocache.js
中进行修复。 在现实世界中,是否有人实际使用带有 url 链接的 GWT?
通过在 html 文档的 <head>
元素中指定一个 <meta>
元素,bootstrap nocache.js 选择器 javascript 将选择正确的模块 baseUrl。 baseUrl 必须是完全指定的绝对 url,并以 /
.
对于我的示例,确切的元素是:
<head>
...
<meta name="gwt:property" content="baseUrl=http://127.0.0.1/app/" />
...
</head>