如何在 GWT 中使用 XMLHttpRequest?

2024-01-16

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


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

Elemental2 是正确的选择

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

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

The Elemental2是一个开源项目,可以在这里找到:https://github.com/google/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 http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJsInterop.html

Examples

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

如果您寻找示例,一个好方法是在 Github 网站上搜索:.

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

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

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

额外的例子来源XMLHttpRequest (using Elemental2)来自要点:。这可能更适合开始,因为它们简短而清晰。

元素2是什么?

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

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

处理XMLHttpRequest就是水平有点低。

您还可以使用该图书馆。 Github 搜索结果之一将引导您访问此存储库:https://github.com/ibaca/autorest-streaming-example https://github.com/ibaca/autorest-streaming-example这是一个有趣的 REST 库的示例:https://github.com/intendia-oss/autorest https://github.com/intendia-oss/autorest。一种现代的、反应式的,可以与 Observables、RxJava 等一起使用。 这个库使用JsInterop并且也迁移到Elemental2是什么让它GWT3/J2CL准备好了,请查看更改:https://github.com/intendia-oss/autorest/commit/58516802cd42134544e6e3787207b5431fae94b5 https://github.com/intendia-oss/autorest/commit/58516802cd42134544e6e3787207b5431fae94b5 .

通过我为您提供的 Github 搜索查询,现在您可以找到更多代码示例XMLHttpRequest。因此,请看一下并找到最适合您需求的一个。

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

我想现在你已经有了一些可供学习的参考资料。

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

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

阅读更多关于Fetch API here:

  • https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

  • https://developers.google.com/web/updates/2015/03/introduction-to-fetch https://developers.google.com/web/updates/2015/03/introduction-to-fetch

  • https://codepen.io/aderaaij/post/fetching-data-with-fetch https://codepen.io/aderaaij/post/fetching-data-with-fetch

  • https://fetch.spec.whatwg.org/ https://fetch.spec.whatwg.org/

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

如果要举例的话,我在 Github 上看不到太多:,但至少有一些东西。

The 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":"[email protected] /cdn-cgi/l/email-protection","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 https://stackoverflow.com/a/50565283/5394086 .

不推荐的方法

如果您遗憾地更喜欢使用旧的 GWT,所以 https://github.com/reinert/requestor(不幸的是,它已停产,并且 GWT 2.7 的开发也已停止,但对于这个 GWT 版本来说,它可能是最好的选择)。但再次请不要走这条路并使用 GWT >= 2.8.2Elemental2/JsInterop相反。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 GWT 中使用 XMLHttpRequest? 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu

随机推荐