IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Supporter les requêtes CORS sur un service Datasnap REST


Sujet :

Web & réseau Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut Supporter les requêtes CORS sur un service Datasnap REST
    Hello les devs !

    J'ai un petit souci qui me cause bien des problèmes :

    J'ai mis en place un datasnap REST, installé comme service sur un serveur externe. Tout fonctionne bien, j'arrive à exécuter des requêtes depuis des sites de test de requêtes REST, et j'arrive à l'utiliser depuis des applications mobiles. Cependant, les requêtes ne fonctionnent pas si je les lance depuis un serveur web local. Le message d'erreur est le suivant :
    Access to XMLHttpRequest at '<URI de la requête>' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

    À partir de là, j'ai bien compris qu'il fallait que j'ajoute le header mentionné. J'ai trouvé plusieurs exemples grâce à notre ami Google, mais toutes sont pour les composants de type TWebModule. Or, mon Datasnap utilise le composant TDSHTTPservice, et pour celui-ci je n'ai trouvé que quelques réponses (qui ne fonctionnent pas) telles qu'ici : https://stackoverrun.com/cn/q/1694676

    Cependant, même avec l'ajout de ce code, le header n'apparaît pas. N'étant qu'un utilisateur novice de Datasnap, je me permets de vous demander votre aide .

    EDIT : J'ai mis des LogMessage dans les événements OnHTTPTrace et OnFormatResult du TDSHTTPService, et BeforeDispatch du TDSHTTPServiceProxyDispatcher. Visiblement, aucun de ces événements n'est déclenché lors du requête, d'où l'inefficacité des codes mentionnés plus haut. J'indique également que le LogMessage fonctionne correctement, car j'en ai mis un dans l'événement OnUserAuthenticate du TDSAuthenticationManager, et qu'il s'affiche dans les logs.
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    c'est probablement une restriction de droit d'accès géré par les navigateurs

    côté serveur envoie cet entête http avec tes réponses : "Access-Control-Allow-Origin: *"

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut
    Merci pour ta réponse !

    Effectivement, de ce que j'ai compris c'est une restriction active lorsque la requête est cross-domain.

    Ensuite, c'est précisément ce que j'essaie de faire (le lien dans mon premier message donne le code à ajouter). Mais apparemment mes requêtes ne déclenchent pas les événements sur lesquels j'ajoute ce header, et du coup je suis coincé !
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur (aussi appelé "programmateur" ou "magicien")
    Inscrit en
    Octobre 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur (aussi appelé "programmateur" ou "magicien")
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 101
    Points : 102
    Points
    102
    Par défaut
    Je vois que je n'avais pas terminé ce topic, je vais donc m'y atteler, au cas où ça peut aider quelqu'un .

    Le problème que j'avais avec ma solution est le suivant : pour créer un datasnap REST en tant que service, je suis parti d'un datasnap standard en tant que service (voir image ci-dessous) et j'ai bidouillé (je sais plus trop comment) pour qu'il supporte les requêtes REST.
    Nom : 03000003.png
Affichages : 345
Taille : 38,9 Ko

    Le souci, c'est que la classe d'un datasnap standard est TDSHTTPservice, et il est impossible de supporter le protocole CORS avec celui-ci (à ma connaissance).

    Afin de résoudre le problème, j'ai fait la chose suivante :
    - Créer un serveur Datasnap REST (dont la classe est TWebModule)
    - Lancer ce serveur à travers un service
    - Mettre en place le support du protocole CORS

    J'espère que ça pourra aider quelqu'un, moi j'ai bien galéré à trouver une solution .
    Delphi 7 et 10.3.2
    IBExpert et Firebird 2.5

    Fervent partisan de la méthode du canard en plastique .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/08/2014, 15h57
  2. [9i] Trace de toutes les requêtes executées sur le serveur
    Par jbenz dans le forum Administration
    Réponses: 4
    Dernier message: 27/06/2014, 16h39
  3. Réponses: 0
    Dernier message: 04/01/2011, 12h36
  4. Router les requêtes http sur 2 IIS
    Par bor1s dans le forum IIS
    Réponses: 1
    Dernier message: 07/12/2010, 11h11
  5. [MySQL] Est-ce que php supporte les requêtes imbriquées ?
    Par dahan dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/03/2006, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo