Возможно ли создать клиент REST с помощью Flex?

Я начинаю проект с использованием архитектуры Restful, реализованной на Java (с использованием нового стандарта JAX-RS)

Мы планируем разработать графический интерфейс с приложением Flex. Я уже нашел некоторые проблемы с этой реализацией с использованием компонента HTTPService (коды ошибок ответа, доступ к заголовкам...).

У любого из вас есть опыт участия в подобном проекте. Это возможно?

15 ответов

Решение

Проблема здесь в том, что многим веб-дискуссиям по этому вопросу уже год или больше. Я сейчас работаю над тем же исследованием, и это то, что я узнал сегодня.

В статье IBM Developer Works за август 2008 года, написанной Хорхе Расилло и Майком Барром, показано, как создать интерфейсное приложение Flex / front-end / RESTful (примеры на PHP и Groovy). Хорошая статья. Во всяком случае, вот забрать:

  • Их код PHP/Groovy использует и ожидает PUT и DELETE.
  • Но код Flex должен использовать POST, но устанавливает для X-Method-Override заголовка HTTP значение DELETE (вы можете сделать то же самое для PUT, который я предполагаю).
  • Обратите внимание, что это не метод Proxy, описанный выше.

// Flex doesn't know how to generate an HTTP DELETE.
// Fortunately, sMash/Zero will interpret an HTTP POST with
// an X-Method-Override: DELETE header as a DELETE.
deleteTodoHS.headers['X-Method-Override'] = 'DELETE';

Что тут происходит? веб-сервер IBM перехватывает и интерпретирует "POST with DELETE" как DELETE.

Итак, я продолжил копаться и нашел этот пост и обсуждение с Доном Боксом (одним из первых парней SOAP). Очевидно, это довольно стандартное поведение, так как некоторые браузеры и т. Д. Не поддерживают PUT и DELETE, и это обходной путь, который уже давно существует. Вот фрагмент, но есть гораздо больше дискуссий.

"Если бы я создавал клиент GData, я искренне удивлялся, почему я вообще потрудился бы использовать методы DELETE и PUT, учитывая, что X-HTTP-Method-Override будет работать в большинстве случаев / развертываний".

Мой вывод из этого заключается в том, что если ваша веб-сторона поддерживает этот заголовок X-Method-Override, то вы можете использовать этот подход. Комментарии от "Дон Бокса" заставляют меня думать, что он довольно хорошо поддерживается, но я еще не подтвердил это.

Другая проблема возникает в связи с возможностью чтения заголовков ответа HTTP. Опять же, из сообщения в блоге Натана де Вриса в 2007 году мы видим, что это обсуждалось. Он добавил к этому сообщению в блоге и обсуждению свой собственный комментарий:

"Единственное изменение в веб-интерфейсе заключается в том, что более новые версии Flash Player (несомненно, поставляемые с бета-версией Flex 3) теперь поддерживают свойство responseHeaders для экземпляров HTTPStatusEvent".

Я надеюсь, что это означает, что это не проблема сейчас.

Как многие указали HTTPService немного упрощенно и не делает всего, что вы хотите. Тем не мение, HTTPService это просто сахар на вершине flash.net.* классы как URLLoader, URLRequest а также URLRequestHeader, Используя их, вы можете собрать большинство HTTP-запросов.

Когда дело доходит до поддержки других методов, кроме GET и POST, проблема в основном заключается в том, что некоторые браузеры (например, Safari) не поддерживают их, а Flash Player полагается на браузер для всех своих сетей.

Есть определенные недостатки в способности Flex действовать как чистый клиент RESTful.

Комментарии ниже взяты из этого блога:

Проблема в том, что класс HTTPService имеет несколько основных ограничений:

  1. Из коробки поддерживаются только методы GET и POST (если только вы не используете FDS и не установите для атрибута useProxy значение true)
  2. Не удалось установить заголовки запроса и нет доступа к заголовкам ответа. Поэтому я не могу получить доступ к телу ответа в случае ошибки.
  3. Это HTTPService получает код состояния что-нибудь другое 200, он считает ошибку. (событие 201, ой!). FaultEvent не предоставляет информацию о коде состояния какого-либо тела ответа. Клиент Flex не будет знать, что пошло не так.

Мэтт Рейбл также дал хорошую презентацию по REST с Rails, Grails, GWT и Flex, с которыми связаны некоторые хорошие ссылки.

Реально это или нет, зависит от того, насколько вы готовы обойти прокси и т. Д.

Я работал над заменой с открытым исходным кодом для компонента HTTPService, который полностью поддерживает REST. Если вам интересно, вы можете найти бета-версию (исходный код и / или скомпилированную совместно используемую библиотеку времени выполнения Flex) и инструкции здесь:

http://code.google.com/p/resthttpservice/

Поддержка Flex для REST в лучшем случае слабая. Я потратил много времени на создание прототипа, поэтому я знаю большинство проблем. Как упоминалось ранее, из коробки есть только поддержка GET и POST. На первый взгляд кажется, что вы можете использовать конфигурацию прокси в LiveCycle Data Services или Blaze, чтобы получить поддержку для PUT и DELETE. Тем не менее, это обман. Запрос от вашего приложения Flex по-прежнему будет POST. Прокси преобразует его в PUT или DELETE на стороне сервера, чтобы обмануть ваш код на стороне сервера. Есть и другие проблемы. Слышно, что это лучшее, что может предложить Adobe. После моей оценки мы решили пойти в другом направлении.

Короткий ответ: да, вы можете сделать RESTful с Flex. Вам просто нужно обойти ограничения Flash-плеера (лучше с последними версиями) и ограничения стека HTTP-браузера.

Мы занимались разработкой клиента RESTful во Flex более года после решения основного заголовка HTTP-запроса и отсутствия PUT и DELETE с помощью подхода rails-esque?_Method=. Может быть, безвкусно, но это делает работу.

Я заметил некоторые проблемы с заголовками в старом сообщении в блоге на http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html

Да, я смог использовать POST и получить доступ к заголовкам с помощью этого компонента:

http://code.google.com/p/as3httpclient/wiki/Links

пример

Сейчас я работаю над приложением, которое в значительной степени зависит от вызовов REST между Flex, JavaScript и сервлетами Java. Мы можем обойти проблему с кодом ошибки ответа, установив соглашение для блока , который возвращается при ошибке, с идентификаторами ошибок, которые приблизительно соответствуют кодам ошибок HTTP.

Мы преодолеваем ограничения межсайтового скриптинга, используя сервлет Java в качестве HTTP-прокси. Вызов прокси-сервера (который выполняется на том же сервере, который обслуживает остальное содержимое, включая содержимое Flex), отправляет запрос на другой сервер, а затем отправляет ответ обратно исходному абоненту.

RestfulX решил большинство / все проблемы REST с Flex. Он поддерживает Rails/GAE/Merb/CouchDB/AIR/WebKit, и я уверен, что было бы несложно подключить его к вашей реализации Java.

Дима также интегрировал в него библиотеку AS3HTTPClient.

Проверьте это!

ОТДЫХ - это больше идеология, чем все остальное. Вы идете на презентации REST, и у них есть прохладительные диспенсеры.

Для приложений Flex прокатка стека в сочетании с маршалингом данных BlazeDS и AMF удобнее и эффективнее.

Книга Flexible Rails может быть полезна - это отличный ресурс о том, как использовать Flex в качестве клиента RESTful. Хотя основное внимание уделяется использованию Flex с платформой Rails, я считаю, что эти концепции применимы к любой среде RESTful. Я использовал эту книгу, чтобы быстро освоить Flex с REST.

Может быть, новый Flex 4 является ответом http://labs.adobe.com/technologies/flex4sdk/

Я работаю над большим флекс-проектом для Франклина Кови. Мы пользуемся услугами REST. Для того, чтобы поддержать это. Мы создали оболочку XMLHttpRequest. Используя внешний интерфейс с некоторыми обработчиками событий. Мы открыли источник библиотеки. Вы можете проверить это на https://github.com/FranklinCovey/AS3-XMLHttpRequest

В прошлом мне удавалось использовать PHP-прокси, который обрабатывает вызовы удаленных веб-служб и возвращает RTU JSON клиенту.

На самом деле они уже используют Flex с Rest-Style Framework. Как уже упоминалось в mbrevort, методы PUT и DELETE не могут использоваться напрямую. Вместо этого мы выполняем PUT через POST, а для DELETE мы используем GET для ресурса с параметром URL, таким как? Action=delete.

Это не 100% стиль отдыха, поэтому я не уверен, работает ли это с реализацией JSR 311. Вам потребуется некоторая гибкость на стороне сервера, чтобы обойти ограничения PUT и DELETE.

Что касается обработки ошибок, мы внедрили службу ошибок. В случае ошибки на стороне сервера приложение Flex может запросить эту службу ошибок, чтобы получить фактическое сообщение об ошибке. Это также намного более гибко, чем просто сопоставление кодов возврата HTTP со статическими сообщениями.

Однако благодаря ECMA-скриптингу Flex работать с REST-сервисами на основе XML очень легко.

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