5

XMLHttpRequest 是来自 GWT 客户端的 HTTP 调用的替代方案,并允许控制请求/响应的所有方面。但是如何使用呢?javadoc地址: http: //www.gwtproject.org/javadoc/latest/com/google/gwt/xhr/client/class-use/XMLHttpRequest.html

4

1 回答 1

12

您还没有提到您使用的 GWT 版本,所以我假设是最新版本。这意味着 2.8.2 或更高版本。

Elemental2 是要走的路

正如上面评论中提到的,Elemental2是正确的方法。我会稍微解释一下。

如果您考虑面向未来的实施(了解GWT3/J2CL新方法),请不要使用遗留 GWT 的东西。这意味着请使用elemental2.dom.XMLHttpRequest代替com.google.gwt.xhr.client.XMLHttpRequest(您提到的那个)。如果可能,请不要使用gwt-user依赖项,因为它将被弃用(如果还没有)。

Elemental2是一个可用的开源项目:https ://github.com/google/elemental2 。它是一种“新 GWT”的基础库。为了更容易地将现有 GWT2.x 项目迁移到 GWT3.x,“旧”的一部分gwt-user目前正在使用JsInterop技术和提到的新方法移植到新方法Elemental2。所以绝对Elemental2是要走的路。

Elemental2 和 JsInterop 一般

如果关于新的 JsInterop 方法,规范还没有那么丰富,但目前您至少会找到一些介绍:http: //www.gwtproject.org/doc/latest/DevGuideCodingBasicsJsInterop.html

例子

XMLHttpRequest在本文中找到一个示例: http ://www.g-widgets.com/2016/09/09/gwt-http-requests-alternatives/

如果您寻找示例,一个好方法是在 Github 网站上以这种方式搜索:https ://github.com/search?q=elemental2.dom.XMLHttpRequest&type=Code 。

(要使用 Github 搜索,您需要先登录,否则您会看到“哇哦!您触发了滥用等等等等……”)

其中一个结果将引导您进入非常有趣的项目(您现在可以预览未来GWT): https ://github.com/gwtproject/gwt-http 。com.google.gwt.http.HTTP它是传统GWT 模块的面向未来的端口。这将有助于将 GWT2.x 项目迁移到 GWT3.x。

当您查看测试包时,您会发现一些示例:https ://github.com/gwtproject/gwt-http/tree/master/src/test/java/org/gwtproject/http/client 。所以这最终是您问题的答案:“如何使用它?” :-)

来自 Gist的XMLHttpRequest(使用)的附加示例源: https ://gist.github.com/search?utf8=%E2%9C%93&q=elemental2.dom.XMLHttpRequest 。这可能更适合开始,因为它们简短而清晰。Elemental2

Elemental2 是什么?

Elemental2为您提供了对本机浏览器 API 的类型检查访问权限。因此,如果您熟悉浏览器的 API,您应该能够实现您的东西,甚至基于一些原生 JavaScript 示例。请考虑一下新的 GWT,例如类型安全的 JavaScript(此外性能非常好且优化良好)。随着JsInterop您创建绑定,它类似于 TypeScript 的绑定。所以实际上你有可能直接处理浏览器的 API,而不需要任何 GWT 特定的东西。

图书馆?更多示例...?

处理XMLHttpRequest水平有点低。

您还可以使用该库。Github 搜索结果之一将引导您访问此存储库:https ://github.com/ibaca/autorest-streaming-example ,这是有趣的 REST 库的示例:https ://github.com/intendia-oss/autorest 。一种现代且反应式的,可与 Observables、RxJava 等一起使用。该库使用JsInterop并迁移到Elemental2使其GWT3/J2CL准备就绪的内容,请参阅更改:https ://github.com/intendia-oss/autorest/commit/58516802cd42134544e6e3787207b5431fae94b5 。

通过我为您提供的 Github 搜索查询,您现在可以找到更多XMLHttpRequest. 因此,请查看并找到最适合您需求的产品。

另一种方法是使用框架,例如来自 RedHat 的 Errai:http ://erraiframework.org/ 。它可以帮助您在不同的抽象级别处理许多问题。

我想现在你有一些参考资料可以学习。

另一方面,现在是 2018 年,为什么不是 Fetch API?

在考虑现代 Web 应用程序时,我宁愿考虑Fetch API使用XMLHttpRequest. 所有现代浏览器现在都原生实现该fetch()功能。那不是解决您的问题的最佳方法吗?fetch()是一种基于 Promise 的机制,允许您发出类似于XMLHttpRequest. Promise 和 Fetch 由 Elemental2 处理。然后,您可以或多或少地以类似于 Mozilla 示例的方式从 Java 代码中使用它。

阅读更多关于Fetch API这里:

更重要的是,正如你所见,这并不是什么新鲜事。如果关于旧浏览器 apolyfill将模拟缺少的功能:https://github.com/github/fetch

如果关于示例,我在 Github 上看不到那么多: https ://github.com/search?utf8=%E2%9C%93&q=elemental2.dom.DomGlobal+fetch&type=Code ,但至少有一些。

Fetch API似乎是该问题的最新解决方案。

请使用 Elemental2 找到一个非常简单的 fetch() 示例。

进口部分:

import static elemental2.dom.DomGlobal.fetch;
import static elemental2.dom.DomGlobal.console;
import elemental2.dom.Response;

然后在您的代码中使用:

    fetch("https://randomuser.me/api/?gender=female&results=1")
            .then(Response::json)
            .then(data -> {
                console.log(Global.JSON.stringify(data));
                return null;
            }).
            catch_(error -> {
                console.log(error);
                return null;
            });

结果,您应该能够看到如下内容:

{"results":[{"gender":"female","name":{"title":"mrs","first":"caroline","last":"coleman"},"location":{"street":"3703 new road","city":"swansea","state":"leicestershire","postcode":"ZH67 0YS","coordinates":{"latitude":"14.7870","longitude":"-107.8990"},"timezone":{"offset":"-6:00","description":"Central Time (US & Canada), Mexico City"}},"email":"caroline.coleman@example.com","login":{"uuid":"25357d90-cce4-4fe6-a3db-8ab77c0272ba","username":"smallpeacock582","password":"citizen","salt":"VX3s05Ah","md5":"84649cce1db8c6f2cbe33098221aa570","sha1":"005abf7d2ca0ff5b1a0bfd6dcee6d4860ef6e75d","sha256":"caadff0a16e27b0d9893aea483aedc7cf7c4707096c33a58acf44336bb2b54be"},"dob":{"date":"1978-03-14T15:47:16Z","age":40},"registered":{"date":"2013-08-10T19:09:41Z","age":5},"phone":"015396 74385","cell":"0726-723-103","id":{"name":"NINO","value":"JA 32 24 22 P"},"picture":{"large":"https://randomuser.me/api/portraits/women/45.jpg","medium":"https://randomuser.me/api/portraits/med/women/45.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/45.jpg"},"nat":"GB"}],"info":{"seed":"98f4f4a344470fbd","results":1,"page":1,"version":"1.2"}}

您可以使用称为 JsInterop DTO 的技术进一步将结果转换为 Java 对象。如果您有兴趣,请在此处找到一些信息:https ://stackoverflow.com/a/50565283/5394086 。

不推荐的方法

如果您遗憾地更喜欢使用旧的 GWT,所以 <= 2.7,那么我认为您可以使用类似的搜索查询在 Github 上搜索一些示例,但对于这个旧版 com.google.gwt.xhr.client.XMLHttpRequest。在这种情况下,我还建议您不要做这么低级别的事情,而是使用像https://github.com/reinert/requestor之类的库(不幸的是,该库已停产,并且 GWT 2.7 上的开发已停止,但是对于此 GWT 版本这可能是最好的选择)。但同样请不要这样做,而是使用 GWT >= 2.8.2 和Elemental2/JsInterop方法。

于 2018-08-29T17:48:31.280 回答