Как использовать 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 Вот:

Более того, в этом нет ничего нового. Если о старых браузерах 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 подход вместо

Другие вопросы по тегам