Demande d'exemple de requêtes en POST

Discussions autour des WebServices WMS / WFS / WPS de la CUB

Demande d'exemple de requêtes en POST

Messagepar fkauder » 29 Août 2018, 13:23

Bonjour,

Je suis en train de travailler sur un outil utilisant les données de l'Open Data, cependant, à cause de requêtes avec des filtres assez longs, j'ai besoin de faire des requêtes POST.
J'ai testé pas mal d'écritures possibles en me basant sur les normes WPS et OGC, mais je n'arrive pas à trouver l'écriture exacte pour faire fonctionner mes filtres.

Je suis bloqué à ce point-ci :
Code: Tout sélectionner
<wps:Execute service="WPS" version="1.0.0" xmlns:wps="http://www.opengis.net/wps/1.0.0"
   xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink"
   mlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.opengis.net/wps/1.0.0/wpsExecute_request.xsd">
      <ows:Identifier>SV_HORAI_A</ows:Identifier>
   
      <wps:DataInputs>
      <wps:Input>
         <ows:Identifier>maxfeatures</ows:Identifier>
         <wps:Data><wps:LiteralData>100</wps:LiteralData></wps:Data>
      </wps:Input>
      <wps:Input>
         <ows:Identifier>filter</ows:Identifier>
         <wps:Data>
            <wps:ComplexData>
               <ogc:Filter>
                  <ogc:Between>
                  <ogc:PropertyName>HOR_THEO</ogc:PropertyName>
                  <ogc:LowerBoundary>
                     <ogc:Literal>2018-08-29T12:05:23</ogc:Literal>
                  </ogc:LowerBoundary>
                  <ogc:UpperBoundary>
                     <ogc:Literal>2018-08-29T12:20:23</ogc:Literal>
                  </ogc:UpperBoundary>
                  </ogc:Between>
               </ogc:Filter></wps:ComplexData>
         </wps:Data>
      </wps:Input>
      </wps:DataInputs>
   </wps:Execute>


Est-ce que vous save d'où vient le problème, ou est-ce que vous pouvez me fournir un exemple de requête POST avec filtre ?

Merci d'avance !
fkauder
 
Messages: 4
Inscrit le: 29 Août 2018, 13:14

Re: Demande d'exemple de requêtes en POST

Messagepar Sébastien Cart-Lamy » 30 Août 2018, 12:00

Avez-vous essayé notre générateur de requêtes WXSQuery ?

http://sig.bordeaux-metropole.fr/apicub/wxsquery/
Sébastien Cart-Lamy
Équipe OpenData
Équipe OpenData
 
Messages: 255
Inscrit le: 23 Juin 2011, 17:16

Re: Demande d'exemple de requêtes en POST

Messagepar fkauder » 03 Septembre 2018, 09:43

Oui, je l'ai testé, mais il ne permet de générer que des requêtes GET (url encoded).

Le problème que j'ai n'est pas situé dans la façon d'écrire les paramètres (que j'ai déjà pu testé en GET), mais dans la syntaxe générale du body en POST, et notamment celle pour ajouter le paramètre du filtre. J'ai testé à la fois LiteralData et ComplexData avec plusieurs possibilités de mises en forme, mais le filtre ne passe jamais.

C'est pourquoi je souhaite avoir un simple exemple de requête en POST avec un body possédant un filtre.

Merci ! :)
fkauder
 
Messages: 4
Inscrit le: 29 Août 2018, 13:14

Re: Demande d'exemple de requêtes en POST

Messagepar Sébastien Cart-Lamy » 03 Septembre 2018, 12:04

Je n'ai pas d'appli qui utilisent des requêtes POST de cette façon, donc pas d'exemple. D'ailleurs, je ne suis pas sûr que ce process WPS supporte le filtre en POST.

Par contre, je peux faire la même requête en GET (modifier les deux dates avec la date du jour sinon ça ne marche pas) :
http://data.bordeaux-metropole.fr/wps?key=[VOTRECLE]&Request=Execute&service=WPS&Version=1.0.0&Identifier=SV_HORAI_A&DataInputs=filter=<Filter><And><PropertyIsGreaterThanOrEqualTo><PropertyName>HOR_THEO</PropertyName><Literal>2018-09-03T08:00:00</Literal></PropertyIsGreaterThanOrEqualTo><PropertyIsLessThanOrEqualTo><PropertyName>HOR_THEO</PropertyName><Literal>2018-09-03T08:00:05</Literal></PropertyIsLessThanOrEqualTo></And></Filter>

Attention cependant : ce type de requête est extrêmement chronophage en CPU / ressource. Il faut l'utiliser intelligemment pour réduire au maximum les appels aux WebServices.

Comment est architecturée votre application ? A quoi sert la récupération des horaires ?
Sébastien Cart-Lamy
Équipe OpenData
Équipe OpenData
 
Messages: 255
Inscrit le: 23 Juin 2011, 17:16

Re: Demande d'exemple de requêtes en POST

Messagepar fkauder » 03 Septembre 2018, 14:29

Je pensais faire un système permettant de récupérer les horaires des arrêts de façon à les fournir à une application de consultation des horaires géolocalisée.
De ce fait, j'ai un système permettant de faire une première récupération des horaires, arrêts, trajets et lignes, puis va récupérer les horaires modifiés dans les 30 dernières secondes toutes les 30 secondes.

Je cherche, via ce système, à avoir tous les horaires sur une plage de 30 minutes (voire une heure si une approche intelligente et peu coûteuse est trouvée).
Le problème est que je ne suis pas sûr d'avoir de mises à jour sur des horaires que je n'ai pas encore dans mon cache. Donc il est possible (si tous les horaires ne sont pas mis à jour) que j'ai un horaire qui ne soit pas disponible de mon côté par manque de mise à jour.
La solution que j'ai trouvé est de faire une vérification toutes les 5 minutes en faisant un appel que je souhaitais tester contenant un filtre assez coûteux qui va récupérer les horaires des 30 prochaines minutes en ignorant les horaires déjà existantes. Cela permettrait de vérifier que le système n'a pas de trous.

Du coup, en écrivant le problème, je me pose une question : est-ce que tous les horaires sur la plage des 30 prochaines minutes sont constamment mis à jour ?
Le cas échéant, cela m'éviterait de mettre en place une solution de correction des horaires. Sinon, voyez-vous une solution qui serait efficace pour vos serveurs ?

Merci d'avance !
fkauder
 
Messages: 4
Inscrit le: 29 Août 2018, 13:14

Re: Demande d'exemple de requêtes en POST

Messagepar Sébastien Cart-Lamy » 04 Septembre 2018, 13:52

Je pense qu'il faut travailler en différentiel. Il faut se base sur le champ MDATE (date de modification de l'objet) qui est mis à jour lorsque l'objet est modifié. Cela permet déjà de ne récupérer beaucoup moins d'objets.
Cela dit, en 5 min il peut y avoir plus de 10000 objets modifiés.

Pour réduire la taille de la réponse à la requête :
  • Utiliser le paramètre propertyname pour ne ramener que les champs nécessaires qui changent + la pk pour la jointure (je vois GID, HOR_REAL, HOR_APP et éventuellement ETAT).
  • Demander une réponse en RAW pour diviser par deux la taille (attention, ce n'est plus vraiment un document XML complet car c'est le contenu brut de la variable result qui est affiché) : RawDataOutput=result

Exemple pour les objets modifiés pour les 5 dernière minutes (mettons qu'il est 12:00) :
http://data.bordeaux-metropole.fr/wps?key=[VOTRECLE]&Request=Execute&service=WPS&RawDataOutput=result&Version=1.0.0&Identifier=SV_HORAI_A&DataInputs=propertyname=GID;propertyname=HOR_REAL;propertyname=HOR_APP;propertyname=ETAT;filter=<Filter><PropertyIsGreaterThanOrEqualTo><PropertyName>MDATE</PropertyName><Literal>2018-09-04T11:55:00</Literal></PropertyIsGreaterThanOrEqualTo></Filter>

Faites des essais et mettez ici vos requêtes / fréquence, je vous dirai si ça passe.
Sébastien Cart-Lamy
Équipe OpenData
Équipe OpenData
 
Messages: 255
Inscrit le: 23 Juin 2011, 17:16

Re: Demande d'exemple de requêtes en POST

Messagepar fkauder » 10 Septembre 2018, 11:08

Bonjour,

Du coup, j'ai pris le temps de faire quelques tests pour voir la façon dont j'allais procéder.
J'ai réalisé un POC qui va simplement récupérer les horaires des 30 prochaines minutes qui ont été mis à jour dans les 30 dernières secondes. Je réitère ce processus toutes les 30 secondes, ce qui fait 200 à 1000 entrées à récupérer toutes les 30 secondes. Je n'ai pas encore modifier les champs que je souhaitais récupérer.
A côté, j'ai lancé un autre processus qui va récupérer les GID de toutes les horaires dans le prochain quart d'heure, et ce toutes les 5 minutes. Cela me permet de vérifier si, en utilisant uniquement les horaires mis à jour, je récupère tous les horaires.

Au bout de 20 minutes, il me manquait 900 horaires. Je suis donc obligé de passer par un système qui va rajouter les horaires manquants tous les 5 minutes afin d'avoir tous les horaires.
L'idée que j'avais pour contourner ce problème était de faire un système en 2 temps : en premier, on va simplement récupérer les GID des horaires restants, puis on envoie une requête pour récupérer spécifiquement ces horaires-là.
Avez-vous une idée pour faire ceci simplement dans une URL (sachant que je peux avoir 300~400 horaires manquantes) ou ai-je le droit de récupérer tous les horaires toutes les 5 minutes sur une période de 15 à 30 minutes pour combler les trous de mon cache ?

Merci d'avance.
fkauder
 
Messages: 4
Inscrit le: 29 Août 2018, 13:14


Retour vers WebServices

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité

cron