2009-04-14 8 views
1

J'ai une application flexible, où l'utilisateur peut fournir un lien vers une ressource. Je veux effectuer une validation simple et vérifier si l'URL est réellement valide (pas seulement la structure, mais en fait tester le lien pour m'assurer que je reçois un 200 OK). J'ai pensé que j'utiliserais juste HttpService et utiliser la méthode HEAD, mais il semble que ce n'est disponible que lorsque vous définissez useProxy à true, mais j'ai essayé et j'ai toujours des erreurs; donc je suis assez sûr que je suis en train de faire quelque chose de mal .... voici un extrait du codeconfus au sujet de useProxy de HttpService (Flex 3)

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(); 

Toute idée de ce que je fais mal? Je suis également ouvert à d'autres suggestions quant à la façon de vérifier si une URL est valide (je préférerais faire cela directement à partir de Flex, sans devoir retourner & sur le serveur). Merci.

EDIT (8/13/2009)

I mis en œuvre simple UrlValidator en utilisant un URLLoader et attribuer 2 auditeurs sur elle. un pour IOError, et l'autre pour Progress. Ma pensée était que Progress agirait comme un appel HEAD, et je pourrais juste tuer le flux après qu'une quantité de données a été reçue. Malheureusement, l'événement de progression est appelé dans le cas d'un 404 ou 403, ce qui va à l'encontre du but. J'ai aussi essayé cela avec l'événement Open, mais j'ai obtenu les mêmes résultats. Des idées?

Répondre

-1

service.method = "HEAD";

devrait être "POST" ou "GET" (par défaut est "GET") mais pas "HEAD"

service.useProxy = true; 

pas nécessaire, retirez la ligne ...

si l'URL est accessible vous obtiendrez un événement RESULT.

+0

Le problème avec l'utilisation d'une requête GET est qu'elle récupèrera réellement le fichier entier (ou tentera de le faire). Ceci n'est pas souhaité car le fichier peut être volumineux. Je veux simplement vérifier s'il existe. – gmoniey

+0

bien ... Je pense que vous pouvez utiliser URLLoader au lieu de HTTPService et écouter l'événement OPEN et tous les autres événements distribués par URLLoader Vous pouvez arrêter le chargement lorsque vous obtenez l'événement OPEN en utilisant la méthode close() – OXMO456

0

Chaque fois que j'essaye d'exécuter votre code avec divers serveurs, j'obtiens des erreurs de politique, donc ce serait une bonne idée d'utiliser Security.loadPolicyFile (url); d'abord avant d'essayer d'exécuter ce code? Je suis en train de jeter hors du bureau, mais je vais essayer de regarder ce nouveau quand je rentre chez moi :)

+0

En fait, je crois que cela ne fonctionne pas parce que mon swf est imbriqué dans un navigateur, et les navigateurs ne supportent pas vraiment les méthodes autres que GET/POST – gmoniey

+0

Que voulez-vous dire par «ceci»? Security.loadPolicyFile fonctionne correctement dans le navigateur. – quoo

+0

Je ne suis pas sûr à 100% ici, mais je crois que les requêtes provenant du SWF passent par le navigateur, elles sont donc limitées par les limitations des navigateurs. De telles limitations ne peuvent pas réellement exécuter les requêtes PUT/DELETE. D'où la raison des hacks lors de l'exécution d'actions REST à partir du navigateur. – gmoniey

1

Flex état docs Adobe: « Quand vous ne passez pas par le service proxy basé sur le serveur, vous pouvez utiliser uniquement les méthodes HTTP GET ou POST, mais lorsque vous définissez la propriété useProxy sur true et que vous utilisez le service proxy basé sur le serveur, vous pouvez également utiliser les méthodes HTTP HEAD, OPTIONS, TRACE et DELETE. "

Le service proxy basé sur le serveur se réfère à Live Cycle Data Services

Je sais AIR prend en charge les demandes de tête à l'aide ServiceMonitor, mais il semble que Flex sur son propre ne fonctionne pas.

Avoir une recherche rapide autour, il semble un peu de gens ont utilisé des prises pour rouler leurs propres classes URLLoader personnalisées qui peuvent accéder à l'en-tête de demande - vous pouvez essayer un d'entre eux

0

HEAD est pris en charge uniquement si service.useProxy est réglé à true. Mais service.useProxy fait référence à HTTPProxyService dans BlazeDS/LCDS. Si vous créez une application client uniquement, vous devez définir service.useProxy sur false et utiliser GET ou POST.

Un autre problème est que si vous suspendez le HTTPProxyService, au moins un des éléments suivants doit être vrai:

  • L'URL doit dans le même domaine que votre application Flex.
  • Un fichier crossdomain.xml (politique inter-domaines) doit être installé sur le serveur Web hébergeant le document permettant l'accès depuis le domaine de l'application.
+0

C'est ce que j'ai pensé. Il est regrettable que vous ne puissiez pas au moins effectuer des GET sur des sites qui n'ont pas de crossdomain. Ou permettez à votre application de contourner la sécurité en la signant (ou quelque chose de similaire à ce que vous pouvez faire avec les applets Java) – gmoniey

Questions connexes