запутался в useProxy HttpService (Flex 3)

У меня есть гибкое приложение, в котором пользователь может предоставить ссылку на ресурс. Я хочу выполнить простую проверку и проверить, действительно ли URL-адрес действителен (не просто структура, но на самом деле проверить ссылку, чтобы убедиться, что я получил 200 OK).

Я подумал, что просто использую HttpService и метод HEAD, но кажется, что это доступно только тогда, когда вы устанавливаете useProxy в значение true, но я пробовал это, и все равно получаю ошибки; поэтому я почти уверен, что делаю что-то не так ... вот фрагмент кода

var service:HTTPService = new HTTPService();
service.method = "HEAD"; 
service.url = url;
service.useProxy = true;
service.addEventListener(ResultEvent.RESULT, result);       
service.addEventListener(FaultEvent.FAULT, error);       
service.send();

Есть идеи, что я делаю не так? Я также открыт для других предложений относительно того, как проверить, действителен ли URL (я бы предпочел сделать это непосредственно из Flex, без необходимости возвращаться к серверу). Спасибо.

РЕДАКТИРОВАТЬ (13.08.2009)

Я реализовал простой UrlValidator, используя UrlLoader и назначив ему 2 слушателя. один для IOError, а другой для Progress. Я думал, что Progress будет действовать аналогично вызову HEAD, и я мог бы просто убить поток после получения некоторого количества данных. К сожалению, событие прогресса вызывается в случае 404 или 403, что не соответствует цели. Я также пробовал это с событием Open, но получил те же результаты. Любые идеи?


person gmoniey    schedule 14.04.2009    source источник


Ответы (4)


В документации Adobe Flex говорится: «Когда вы не используете серверную прокси-службу, вы можете использовать только методы HTTP GET или POST. Однако, когда вы устанавливаете для свойства useProxy значение true и используете серверную прокси-службу, вы также можно использовать методы HTTP HEAD, OPTIONS, TRACE и DELETE. "

Серверный прокси-сервис имеет в виду Live Cycle Data Services.

Я знаю, что AIR поддерживает запросы HEAD с помощью ServiceMonitor, но похоже, что Flex сам по себе этого не делает.

Проведя быстрый поиск, похоже, что несколько человек использовали сокеты для развертывания своих собственных пользовательских классов URLLoader, которые могут получать доступ к заголовкам запросов - вы можете попробовать один из них.

person misterduck    schedule 30.04.2009

Каждый раз, когда я пытаюсь запустить ваш код на различных серверах, я получаю ошибки политики, поэтому было бы неплохо использовать Security.loadPolicyFile (url); прежде чем пытаться запустить этот код? Меня выгоняют из офиса, но я попробую еще раз взглянуть на это, когда вернусь домой :)

person quoo    schedule 23.04.2009
comment
На самом деле, я считаю, что это не работает, потому что мой swf вложен в браузер, а браузеры на самом деле не поддерживают другие методы, кроме GET / POST. - person gmoniey; 24.04.2009
comment
Что ты хочешь этим сказать'? Security.loadPolicyFile отлично работает в браузере. - person quoo; 24.04.2009
comment
Я не уверен здесь на 100%, но я считаю, что запросы, исходящие из SWF, проходят через браузер, поэтому они ограничены ограничениями браузеров. Такие ограничения не позволяют фактически выполнять запросы PUT / DELETE. Отсюда и причина взлома при выполнении действий REST из браузера. - person gmoniey; 25.04.2009
comment
Ох. да, тогда я бы попробовал URLLoader.load (), а затем остановился бы, как только вы нажмете событие httpResponseStatus, которое, как я знаю, не идеально, но будет работать ... или я все еще подозреваю, если вы вызовете Security.loadPolicyFile (servertotest.com/fullurl) также предоставит вам информацию, которую вы ищете. Извините, я больше не помог! - person quoo; 26.04.2009

HEAD поддерживается, только если для service.useProxy установлено значение true. Но service.useProxy относится к HTTPProxyService в BlazeDS / LCDS. Если вы создаете только клиентское приложение, вам нужно будет установить service.useProxy на false и использовать либо GET, либо POST.

Другая проблема заключается в том, что если вы игнорируете HTTPProxyService, должно выполняться по крайней мере одно из следующего:

  • URL-адрес должен находиться в том же домене, что и ваше приложение Flex.
  • Файл crossdomain.xml (междоменная политика) должен быть установлен на веб-сервере, на котором размещен документ, разрешающий доступ из домена приложения.
person Martin Harrigan    schedule 01.09.2009
comment
Вот что я подумал. К сожалению, вы не можете, по крайней мере, выполнять GET на сайтах, у которых нет кроссдоменов. Или разрешите вашему приложению обойти защиту, подписав его (или что-то подобное тому, что вы можете делать с Java-апплетами) - person gmoniey; 10.09.2009

service.method = "ГОЛОВА";

должно быть "POST" или "GET" (по умолчанию "GET"), но не "HEAD"

service.useProxy = true;

не надо, убираем строчку ...

если URL доступен, вы получите событие RESULT.

person OXMO456    schedule 14.04.2009
comment
Проблема с использованием запроса GET заключается в том, что он фактически получит весь файл (или попытается это сделать). Это нежелательно, поскольку файл может быть большим. Я просто хочу проверить, существует ли он. - person gmoniey; 14.04.2009
comment
ну ... я думаю, вы могли бы использовать URLLoader вместо HTTPService и слушать событие OPEN и все другие события, отправленные URLLoader. Вы можете остановить загрузку, когда получите событие OPEN, используя метод close () - person OXMO456; 15.04.2009