Как использовать XMLHttpRequest в GWT?
XMLHttpRequest является альтернативой для HTTP-вызовов со стороны клиента GWT и позволяет контролировать все аспекты запросов / ответов. Но как это использовать? адрес javadoc: http://www.gwtproject.org/javadoc/latest/com/google/gwt/xhr/client/class-use/XMLHttpRequest.html
1 ответ
Вы не упомянули, какую версию 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. Так что это, наконец, ответ на ваш вопрос: "Как это использовать?":-)
Дополнительный пример источника для XMLHttpRequest
(с помощью Elemental2
) из Gist: https://gist.github.com/search?utf8=%E2%9C%93&q=elemental2.dom.XMLHttpRequest. Это, вероятно, даже лучше для начала, так как они короткие и понятные.
Что такое 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
, Поэтому, пожалуйста, просто посмотрите и найдите лучший вариант для ваших нужд.
Альтернативным подходом может быть использование фреймворка, например, Errai из RedHat: http://erraiframework.org/. Это поможет вам справиться со многими проблемами на другом уровне абстракции.
Я думаю, что теперь у вас есть ссылки на учебу.
С другой стороны, это 2018, так почему бы не Fetch API?
Когда я думаю о современном веб-приложении, я бы предпочел Fetch API
вместо XMLHttpRequest
, Все современные браузеры теперь реализуют fetch()
функционировать изначально. Разве это не лучший способ решить вашу проблему? fetch()
это механизм на основе Promise, который позволяет вам делать сетевые запросы, аналогичные XMLHttpRequest
, Обещания и Fetch обрабатываются Elemental2. Затем вы можете использовать его из своего Java-кода более или менее таким же образом, как в примерах Mozilla.
Узнайте больше о Fetch API
Вот:
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
https://developers.google.com/web/updates/2015/03/introduction-to-fetch
Более того, в этом нет ничего нового. Если о старых браузерах polyfill
будет эмулировать отсутствующую функцию: https://github.com/github/fetch.
Что касается примеров, я не вижу так много на Github: https://github.com/search?utf8=%E2%9C%93&q=elemental2.dom.DomGlobal+fetch&type=Code, но по крайней мере кое-что.
Fetch API
кажется наиболее актуальным решением проблемы.
Пожалуйста, найдите очень простой пример fetch() с использованием Elemental2.
Раздел импорта:
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"}}
Далее вы можете преобразовать результат в Java-объект, используя технику, называемую JsInterop DTOs. Если вы заинтересованы, пожалуйста, найдите некоторую информацию здесь: /questions/22095901/oshibka-kompilyatsii-net-ishodnogo-koda-dlya-tipa-comgooglegsongson/22095914#22095914.
Не рекомендуется подход
Если вы, к сожалению, предпочитаете использовать старый 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
подход вместо