Suite

Utilisation d'AJAX pour exécuter des instructions SQL PostGIS et afficher les résultats via GeoServer

Utilisation d'AJAX pour exécuter des instructions SQL PostGIS et afficher les résultats via GeoServer


J'apprends le SIG Web et je ne trouve pas un bon exemple qui donne une vue d'ensemble d'une interface Web d'exécution d'analyse spatiale à l'aide de PostGIS.

Ce que je recherche, c'est une version graphique/SIG de pgAdmin s'exécutant sur le Web. Étant donné une instruction SQL, l'interface Web appelle PostGIS, générant éventuellement une table de résultats, qui est ensuite rendue sous une forme graphique/cartographique plutôt que sous une forme tabulaire comme dans pgAdmin.

J'ai regardé autour de moi et la plupart des questions/réponses ici concernent la façon d'afficher une table existante dans PostGIS. Mais il n'y a rien qui couvre la boucle complète. C'est-à-dire démarrer la requête, stocker le résultat dans la base de données, l'afficher et peut-être utiliser la table de résultats pour une nouvelle requête.

J'ai un peu de familiarité avec GeoServer et son API RESTful, et une connaissance très basique de JavScript/jQuery/HTML5.

Certains peuvent-ils suggérer un itinéraire viable pour réaliser cette boucle requête-magasin-affichage ?

Remarque: je suis moins intéressé par la partie visualisation et l'obtention de GeoJson car ils ne peuvent pas être directement utilisés par PostGIS pour une analyse plus approfondie.


D'après la réponse de @John, GeoJSON semble être une très bonne option et je pense qu'il y a une bonne raison pour laquelle GeoJSON est si populaire. En revanche, j'espérais trouver une solution plus "côté serveur" qui repose principalement sur PostGIS fait l'analyse spatiale et GeoServer faisant le rendu/cartographie des tables/vues PostGIS. Espérons que cela impliquera une programmation côté client minimale (autre que l'émission de commandes SQL et d'appels d'API GeoServer).

Je peux le faire manuellement avec pgAdmin avec l'interface d'administration GeoServer ou l'API RESTfulboucleing. Mais je ne sais pas comment faire la même chose par programmation à partir du Web avec, par exemple. API AJAX et REST. j'ai essayé d'utiliserWPS, mais sans grand succès. Par exemple, j'ai essayé d'effectuer une simple algèbre de carte raster, mais le WPS dans GeoServer prend deux rasters d'entrée du serveur et ne vous donne qu'une image de sortie à télécharger, pas un autre jeu de données raster pour une analyse plus approfondie. Ici, la "boucle" est rompue.

De plus, les fonctions WPS varient d'un package à l'autre. S'il y a quelque chose qui ne va pas dans un WPS, il est moins facile de le réparer à moins que l'équipe en amont ne soit vraiment active.

Je pense donc ne pas compter sur WPS, mais plutôt sur PostGIS pour effectuer toutes les analyses vectorielles et raster, car je pense que Postgres est plus testé et que l'algèbre relationnelle/carte qu'il contient est complète. Et j'espérais utiliser AJAX comme "centre de commande" pour émettre des instructions SQL à Postgres (peut-être avec un proxy PHP côté serveur ??), et pour rendre certaines des tables résultantes sur le Web via GeoServer (ou un autre serveur de carte) (par exemple en publiant/mettant à jour les tableaux/vues de résultats).


Votre question est assez large, mais d'après ce que vous dites, le meilleur format serait GeoJSON. OpenLayers, Leaflet et Google Maps lisent et affichent tous GeoJSON, avec une quantité triviale de codage requise. Voici l'exemple Open Layers 3 GeoJSON. OpenLayers 2 et 3 ont également des rédacteurs (Geo)JSON, qui vous permettent de sérialiser les objets vectoriels OpenLayers vers JSON pour le stockage de la base de données.

En ce qui concerne l'obtention de JSON à partir du serveur en premier lieu, vous avez quelques options de GeoServer.

  1. WFS. Cela permet la lecture et la mise à jour des données et transmettra les données dans un certain nombre de formats, y compris GeoJSON. Voir la documentation GeoServer WFS pour plus d'informations. Voici l'exemple OpenLayers 3 WFS

  2. WPS. Cela vous permet d'envoyer des requêtes à distance à GeoServer et de récupérer les résultats dans votre client Web, la valeur par défaut étant JSON, voir la documentation Geoserver. Voici un exemple OpenLayers 2 WPS. Cette approche vous permet en fait d'effectuer des opérations SIG/spatiales sur vos géométries, tampon, union, etc., à distance et de récupérer les résultats dans le client.

Il existe également d'autres options, telles que le lancement de la vôtre, que vous devrez faire si vous utilisez simplement AJAX pour faire la demande - vous devrez ensuite coder le côté serveur d'une manière ou d'une autre. Pour obtenir plusieurs fonctionnalités de Postgres, ainsi que leurs attributs, vous devez créer unFeatureCollection. Cela peut être fait en utilisant le type de données JSON et les fonctions row_to_json et array_to_json. Une requête typique, qui vient de Regina Obe, auteur de Postgis in Action, sur le site Web de Boston Gis ressemble à ceci :

SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) As Features FROM (SELECT 'Feature' As type, ST_AsGeoJSON(lg.geog)::json As geometry, row_to_json((SELECT l FROM (SELECT loc_id, loc_name) As l) ) As properties FROM locations As lg ) As f ) As fc;

ce qui est assez difficile à regarder quand vous le voyez pour la première fois, mais très puissant. Cela signifie que vous avez toujours vos géométries dans un champ géométrique, vous pouvez donc effectuer toutes les analyses SIG que vous souhaitez, tout en produisant facilement GeoJSON à des fins d'affichage.

Il existe également des options utilisantGéoDjangoet la bibliothèque vectorformats qui produira également GeoJSON avec des attributs directement à partir d'une table Postgres. Vous n'avez pas spécifiquement mentionné Python/Django, mais comme Python est si populaire parmi les personnes SIG, j'ai pensé que cela méritait d'être mentionné. Voici un article de blog plus long sur l'approche GeoDjango to GeoJSON.

Enfin, il n'est pas strictement vrai que vous ne pouvez pas faire d'analyse sur JSON une fois qu'il est dans Postgres. Depuis Postgres 9.2, il existe un type de données JSON et dans le prochain Postgres 9.4, il y aura un format JSON binaire, connu sous le nom de JSONB, qui permettra l'indexation et la recherche directement sur JSON. Je ne le recommande pas nécessairement, étant donné le riche éventail de fonctions disponibles sur des colonnes de géométrie distinctes, mais je le mentionne par souci d'exhaustivité. Je pense que c'est en quelque sorte une réponse à la popularité croissante des magasins de clés/valeurs dans les bases de données NoSQL, telles que MongoDB, et ne remplacera en aucun cas la colonne de géométrie de Postgis pour les requêtes de type SIG.

Il y a aussi le format WKT, qui peut être utilisé de manière similaire, mais c'est beaucoup plus pénible d'y ajouter des attributs, et il y a GML/XML, qui permet l'encodage de structures complexes, mais c'est pénible travailler avec Javascript (beaucoup diraient, en général), alors que JSON est natif, donc parfait pour "WebGIS".

Désolé, pour une réponse si longue, mais ta question est assez large :D


On dirait que vous voulez créer une couche dynamiquement via l'API REST en tant que vue SQL.

Une autre approche serait de créer des vues dans PostGis, de mettre à jour le magasin et de publier la vue en tant que couche.

Le premier n'encombre pas la base de données de vues et votre travail dynamique est rassemblé dans GeoServer. L'API REST utilise l'authentification de base, il est donc plus facile de faire passer les appels par proxy en ajoutant l'en-tête Authenticate dans le proxy. De plus, les informations d'identification ne sont pas lisibles pour vos utilisateurs.


Récupérer et afficher les données de la base de données dans OutSystems

Vous avez souvent besoin de récupérer des données dans une base de données pour, par exemple, les afficher à l'écran. Un moyen efficace d'extraire des données des bases de données dans OutSystems consiste à utiliser un agrégat.

Ce document vous guide à travers deux étapes :

  1. Obtenir des données. Vous devez d'abord charger certaines données de votre base de données. L'exemple utilise des exemples de données d'entités provenant d'OutSystems, mais vous pouvez également utiliser vos entités.
  2. Affichage des données. Une fois que votre application contient des données, vous pouvez afficher tous les enregistrements ou seulement certains. L'exemple utilise le widget Liste, mais vous pouvez ajouter une Table ou un autre widget.

Nous avons travaillé sur cet article. Merci de nous faire part de l'utilité de cette nouvelle version en votant.


2 réponses 2

Ce que vous rencontrez (AJAX fonctionne localement, mais pas sur le serveur) il y a un problème de délai. Localement, tout fonctionne si vite, que vous ne pouvez pas voir ton problème. Bref, voici ton problème :

Le rappel AJAX (A) s'exécute > Le rappel AJAX (B) ne sait pas qu'il doit attendre (A) > Vous ne pouvez pas voir le problème dans votre installation locale car (A) est terminé trop vite.

Vous devez donc trouver un moyen de dire à votre rappel (B) qu'il doit attendre (A). Voici comment:


Exercices SQL, Pratique, Solution - SOUS-REQUÊTES

2. Ecrivez une requête pour afficher le nom (prénom et nom), le salaire, l'identifiant du service, l'identifiant du poste pour les employés qui travaillent dans la même désignation que l'employé travaille dont l'identifiant est 169. Accédez à l'éditeur

3. Écrivez une requête pour afficher le nom (prénom et nom), le salaire, l'identifiant du département pour les employés qui gagnent un tel salaire qui est le plus petit salaire de l'un des départements. Aller à l'éditeur

4. Écrivez une requête pour afficher l'identifiant de l'employé, le nom de l'employé (prénom et nom) pour tous les employés qui gagnent plus que le salaire moyen. Aller à l'éditeur

5. Écrivez une requête pour afficher le nom de l'employé (prénom et nom), l'identifiant de l'employé et le salaire de tous les employés qui relèvent de Payam. Aller à l'éditeur

6. Rédigez une requête pour afficher le numéro de service, le nom (prénom et nom), le poste et le nom du service pour tous les employés du service Finance. Aller à l'éditeur

7. Écrivez une requête pour afficher toutes les informations d'un employé dont le salaire et l'identifiant du déclarant sont respectivement 3000 et 121. Aller à l'éditeur

8. Affichez toutes les informations d'un employé dont l'identifiant est l'un des nombres 134, 159 et 183. Accédez à l'éditeur

9. Ecrivez une requête pour afficher toutes les informations des salariés dont le salaire est compris entre 1000 et 3000. Accéder à l'éditeur

10. Ecrivez une requête pour afficher toutes les informations des salariés dont le salaire se situe dans la fourchette du plus petit salaire et 2500. Accéder à l'éditeur

11. Ecrivez une requête pour afficher toutes les informations des employés qui ne travaillent pas dans les départements où travaillent certains employés dont l'identifiant du responsable est compris entre 100 et 200. Accéder à l'éditeur

12. Écrivez une requête pour afficher toutes les informations pour les employés dont l'identifiant est n'importe quel identifiant qui gagne le deuxième salaire le plus élevé. Aller à l'éditeur

13. Ecrivez une requête pour afficher le nom de l'employé( prénom et nom de famille) et embauché pour tous les employés du même département que Clara. Exclure Clara. Aller à l'éditeur

14. Rédigez une requête pour afficher le numéro et le nom de l'employé (prénom et nom) pour tous les employés qui travaillent dans un service avec tout employé dont le nom contient un T. Aller à l'éditeur

15. Écrivez une requête pour afficher le numéro d'employé, le nom (prénom et nom) et le salaire de tous les employés qui gagnent plus que le salaire moyen et qui travaillent dans un service avec un employé avec un J dans leur nom. Aller à l'éditeur

16. Affichez le nom de l'employé (prénom et nom de famille), l'identifiant de l'employé et le titre du poste pour tous les employés dont l'emplacement du service est Toronto. Aller à l'éditeur

17. Écrivez une requête pour afficher le numéro d'employé, le nom (prénom et nom de famille) et le titre du poste pour tous les employés dont le salaire est inférieur à tout salaire des employés dont le titre du poste est MK_MAN. Aller à l'éditeur

18. Écrivez une requête pour afficher le numéro d'employé, le nom (prénom et nom de famille) et le titre du poste pour tous les employés dont le salaire est inférieur à tout salaire des employés dont le titre du poste est MK_MAN. Exclure le titre du poste MK_MAN. Aller à l'éditeur

19. Écrivez une requête pour afficher le numéro d'employé, le nom (prénom et nom de famille) et l'intitulé du poste pour tous les employés dont le salaire est supérieur à tout salaire des employés dont l'intitulé du poste est PU_MAN. Exclure le titre du poste PU_MAN. Aller à l'éditeur

20. Écrivez une requête pour afficher le numéro d'employé, le nom (prénom et nom de famille) et le titre du poste pour tous les employés dont le salaire est supérieur à tout salaire moyen de n'importe quel département. Aller à l'éditeur

21. Écrivez une requête pour afficher le nom de l'employé (prénom et nom de famille) et le département pour toute existence de ces employés dont le salaire est supérieur à 3700. Aller à l'éditeur

22. Écrivez une requête pour afficher l'ID du département et le salaire total pour les départements qui contiennent au moins un employé. Aller à l'éditeur

23. Écrivez une requête pour afficher l'identifiant de l'employé, le nom (prénom et nom de famille) et la colonne d'identifiant du poste avec un titre modifié SALESMAN pour les employés dont le titre du poste est ST_MAN et DEVELOPER pour le titre du poste est IT_PROG. Aller à l'éditeur

24. Écrivez une requête pour afficher l'identifiant de l'employé, le nom (prénom et nom), le salaire et la colonne SalaryStatus avec un titre HIGH et LOW respectivement pour les employés dont le salaire est supérieur et inférieur au salaire moyen de tous les employés. Aller à l'éditeur

25. Écrivez une requête pour afficher l'identifiant de l'employé, le nom (prénom et nom), SalaryDrawn, AvgCompare (salaire - le salaire moyen de tous les employés) et la colonne SalaryStatus avec un titre HIGH et LOW respectivement pour les employés dont le salaire est supérieur à et inférieur au salaire moyen de tous les employés. Aller à l'éditeur

26. Écrivez une sous-requête qui renvoie un ensemble de lignes pour rechercher tous les services auxquels un ou plusieurs employés sont affectés. Aller à l'éditeur

27. Rédigez une requête qui identifiera tous les employés qui travaillent dans des services situés au Royaume-Uni. Aller à l'éditeur

Exemple de tableau : emplacements

Exemple de tableau : pays

28. Rédigez une requête pour identifier tous les employés qui gagnent plus que la moyenne et qui travaillent dans l'un des services informatiques. Aller à l'éditeur

29. Rédigez une requête pour déterminer qui gagne plus que M. Ozer. Aller à l'éditeur

30. Rédigez une requête pour savoir quels employés ont un responsable qui travaille pour un service basé aux États-Unis. Aller à l'éditeur

31. Écrivez une requête qui recherche les noms de tous les employés dont le salaire est supérieur à 50 % de la masse salariale totale de leur service. Aller à l'éditeur

32. Écrivez une requête pour obtenir les détails des employés qui sont des gestionnaires. Aller à l'éditeur

33. Rédigez une requête pour obtenir les détails des employés qui gèrent un service. Aller à l'éditeur

34. Ecrivez une requête pour afficher l'identifiant de l'employé, le nom (prénom et nom), le salaire, le nom du département et la ville pour tous les employés qui reçoivent le salaire comme le salaire gagné par l'employé qui est maximum au sein de la personne qui rejoint le 1er janvier 2002 et 31 décembre 2003. Aller à l'éditeur

35. Écrivez une requête en SQL pour afficher le code et le nom du département pour tous les départements situés dans la ville de Londres. Aller à l'éditeur

36. Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID de service de tous les employés qui gagnent plus que le salaire moyen et organisez la liste par ordre décroissant de salaire. Aller à l'éditeur

37. Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID du service pour les employés qui gagnent plus que le salaire maximum d'un service dont l'ID est 40. Accédez à l'éditeur

38. Écrivez une requête en SQL pour afficher le nom et l'identifiant du département pour tous les départements où ils se trouvent, cet identifiant est égal à l'identifiant de l'emplacement où se trouve le département numéro 30. Aller à l'éditeur

39. Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID de service pour tous les employés qui travaillent dans ce service où travaille l'employé qui détient l'ID 201. Aller à l'éditeur

40. Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID de service pour les employés dont le salaire est égal au salaire de l'employé qui travaille dans ce service dont l'ID est 40. Accédez à l'éditeur

41. Ecrivez une requête en SQL pour afficher le nom, le prénom et le code du département pour tous les employés qui travaillent dans le département Marketing. Aller à l'éditeur

42.Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID du service pour les employés qui gagnent plus que le salaire minimum d'un service dont l'ID est 40. Accédez à l'éditeur

43. Écrivez une requête en SQL pour afficher le nom complet, l'adresse e-mail et la désignation de tous les employés qui ont été embauchés après l'employé dont l'ID est 165. Accédez à l'éditeur

44. Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID du service pour les employés qui gagnent moins que le salaire minimum d'un service dont l'ID est 70. Accédez à l'éditeur

45. Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID du service pour les employés qui gagnent moins que le salaire moyen, et qui travaillent également dans le service où l'employé Laura travaille en tant que titulaire du prénom. Aller à l'éditeur

46. Écrivez une requête en SQL pour afficher le prénom et le nom, le salaire et l'ID du service pour les employés dont le service est situé dans la ville de Londres. Aller à l'éditeur

47. Ecrivez une requête en SQL pour afficher la ville de l'employé dont l'ID 134 et y travaille. Aller à l'éditeur

48. Ecrivez une requête en SQL pour afficher les détails de ces départements dont le salaire maximum est de 7000 ou plus pour les employés qui ont déjà effectué un ou plusieurs travaux. Aller à l'éditeur

49. Ecrivez une requête en SQL pour afficher les informations détaillées des départements dont le salaire de départ est d'au moins 8000. Accédez à l'éditeur

50. Ecrivez une requête en SQL pour afficher le nom complet (prénom et nom) du manager qui supervise 4 employés ou plus. Aller à l'éditeur

51. Écrivez une requête en SQL pour afficher les détails de l'emploi actuel pour les employés qui ont travaillé en tant que représentant des ventes dans le passé. Aller à l'éditeur

52. Écrivez une requête en SQL pour afficher toutes les informations sur les employés qui gagnent le deuxième salaire le plus bas de tous les employés. Aller à l'éditeur

53. Ecrivez une requête en SQL pour afficher les détails des services gérés par Susan. Aller à l'éditeur

54. Écrivez une requête en SQL pour afficher l'ID du service, le nom complet (prénom et nom), le salaire des employés qui ont le salaire le plus élevé dans un service. Aller à l'éditeur

55. Ecrivez une requête en SQL pour afficher toutes les informations de ces employés qui n'avaient pas de travail dans le passé. Aller à l'éditeur


Hfrhyu

Relations entre deux dérivées partielles réciproques ?

Quelle force fait augmenter l'entropie ?

Le retrait de l'asile peut-il être illégal ?

Comment définir le bien dans une religion qui ne revendique aucune autorité morale ?

Comment garder les échecs amusants quand votre adversaire vous bat constamment ?

Est-il éthique de télécharger un article généré automatiquement sur un site non évalué par des pairs dans le cadre d'une recherche plus large ?

Les signatures suivantes n'étaient pas valides : EXPKEYSIG 1397BC53640DB551

Comment ajouter des taches aléatoires sur le même visage en cycles ?

Combien de temps dure la ligne de vue que vous pouvez créer par une action en utilisant le sort Investiture de la flamme ?

Le crédit pour l'image du trou noir a-t-il été attribué à tort ?

Motivation de l'université à occuper des postes menant à la permanence

En quoi la simplicité vaut-elle mieux que la précision et la clarté de la prose ?

Python - Simulateur de pêche

Comment copier le contenu de tous les fichiers portant un certain nom dans un nouveau fichier ?

Pourquoi cette méthode itérative de résolution d'équations fonctionne-t-elle ?

Simulation d'explosion de dés

Est-ce que chaque épisode de "Où sont mes pantalons?" identique?

Les smartphones avec le même capteur d'appareil photo peuvent-ils avoir une qualité d'image différente ?

comment un quatrième intervalle parfait peut-il être considéré comme consonne ou dissonant ?

L'arbre de dérivation ne s'affiche pas

Le conseiller en hypothèques recommande une durée plus longue que nécessaire combinée à des paiements en trop

Comment exporter un fichier de formes à l'aide de Leaflet ?

Maintenance planifiée prévue le 17/18 avril 2019 à 00:00 UTC (20:00 US/Eastern)Extraire les données de polygones pour chaque quartier du fichier de formesConvertir les données du fichier de formes en GeoJSONLes chevauchements de polygones sur “Fusionner le fichier de formes”Comment importer par programme un fichier de formes dans Oracle DB à l'aide Java ? Déplacer un fichier de formes à l'aide de Python Shutil ? Exporter WFS vers un fichier de formes ? Comment convertir des fichiers de formes IPUMS-NHGIS en fichiers GeoJSON à l'aide de R, puis les afficher à l'aide de Leaflet ? Pourquoi mon fichier de formes (.shp) a-t-il disparu ? Importer un fichier de formes dans PostGIS et EPSG de créé table est différente de Shapefile ?Utilisation de la calculatrice de champs sur un fichier de formes converti à partir de DWG dans ArcGIS Desktop ?

Je veux un bouton "exporter" car j'ai cliqué dessus, le fichier de formes doit être téléchargé avec tous les fichiers shp, shx, prj, dbf en tant que dossier zip. Mon projet est basé sur un SIG dans lequel j'ai deux tâches principales :


  1. Importer un fichier de formes: shapefile à geojson, c'est-à-dire que je fais avec l'aide de leafLet.

  2. Exporter le fichier de formes: après avoir dessiné/édité sur la carte/couche/fichier de formes, le fichier de formes en double doit être créé.

Comment puis-je exporter la copie de ce fichier de formes particulier ?

Je veux un bouton "exporter" car j'ai cliqué dessus, le fichier de formes doit être téléchargé avec tous les fichiers shp, shx, prj, dbf en tant que dossier zip. Mon projet est basé sur un SIG dans lequel j'ai deux tâches principales :


  1. Importer un fichier de formes: shapefile à geojson, c'est-à-dire que je fais avec l'aide de leafLet.

  2. Exporter le fichier de formes: après avoir dessiné/édité sur la carte/couche/fichier de formes, le fichier de formes en double doit être créé.

Comment puis-je exporter la copie de ce fichier de formes particulier ?

Je veux un bouton "exporter" car j'ai cliqué dessus, le fichier de formes doit être téléchargé avec tous les fichiers shp, shx, prj, dbf en tant que dossier zip. Mon projet est basé sur un SIG dans lequel j'ai deux tâches principales :


  1. Importer un fichier de formes: shapefile à geojson, c'est-à-dire que je fais avec l'aide de leafLet.

  2. Exporter le fichier de formes: après avoir dessiné/édité sur la carte/couche/fichier de formes, le fichier de formes en double doit être créé.

Comment puis-je exporter la copie de ce fichier de formes particulier ?

Je veux un bouton "exporter" car j'ai cliqué dessus, le fichier de formes doit être téléchargé avec tous les fichiers shp, shx, prj, dbf en tant que dossier zip. Mon projet est basé sur un SIG dans lequel j'ai deux tâches principales :


  1. Importer un fichier de formes: shapefile à geojson, c'est-à-dire que je fais avec l'aide de leafLet.

  2. Exporter le fichier de formes: après avoir dessiné/édité sur la carte/couche/fichier de formes, le fichier de formes en double doit être créé.

Comment puis-je exporter la copie de ce fichier de formes particulier ?


Validation JSON

N'oublions pas de valider nos données JSON ! Il existe un outil de validation JSON en ligne appelé JSONLint, qui peut être utilisé pour valider les fichiers JSON. Contrairement à JavaScript, JSON est très strict et n'a pas de tolérances, par ex. les virgules de fin susmentionnées ou plusieurs façons d'écrire les clés (avec / , sans guillemets).

Examinons donc certaines des erreurs les plus courantes lors du traitement de JSON.

Erreurs $.getJSON courantes

  • Échecs silencieux sur les appels $.getJSON : cela peut se produire si, par exemple, jsoncallback=json1234 a été utilisé, alors que la fonction json1234() n'existe pas. Dans de tels cas, $.getJSON émettra une erreur silencieuse. Il faut donc toujours utiliser jsoncallback=? pour laisser jQuery gérer automatiquement le rappel initial.
  • Dans le meilleur des cas, du vrai JSON (au lieu de JSONP) est utilisé (soit en parlant avec notre propre serveur, soit via CORS). Cela élimine un ensemble d'erreurs potentiellement introduites en utilisant JSONP. La question cruciale est la suivante : le serveur/l'API prennent-ils en charge JSONP ? Existe-t-il des restrictions sur l'utilisation de JSONP ?
  • Erreur de syntaxe non détectée : jeton inattendu (dans Chrome) ou étiquette non valide (dans Firefox). Ce dernier peut être corrigé en passant les données JSON au rappel JavaScript. En général, cependant, c'est un indicateur fort que le JSON est mal formé. Envisagez d'utiliser JSONLint comme indiqué ci-dessus.

La grande question est maintenant : comment détecter si l'erreur réside réellement dans le JSON transporté ?

Comment corriger les erreurs JSON

Il y a trois points essentiels qui doivent être couverts avant de commencer tout débogage lié à JSON :

  • Nous devons nous assurer que le JSON renvoyé par le serveur est au bon format avec le bon type MIME utilisé.
  • Nous pouvons essayer d'utiliser $.get au lieu de $.getJSON car il se peut que notre serveur renvoie un JSON invalide. De plus, si JSON.parse() échoue sur le texte renvoyé, nous savons immédiatement que le JSON est à blâmer.
  • Nous pouvons vérifier les données renvoyées en les connectant à la console. Cela devrait ensuite être la source d'investigations ultérieures.

Le débogage doit alors commencer avec l'outil JSONLint mentionné précédemment.


Exemple d'injection SQL basée sur une union

L'un des types d'injection SQL les plus courants utilise l'opérateur UNION. Il permet à l'attaquant de combiner les résultats de deux ou plusieurs instructions SELECT en un seul résultat. La technique s'appelle syndicatbasé sur l'injection SQL.

Voici un exemple de cette technique. Il utilise la page Web testphp.vulnweb.com, un site Web intentionnellement vulnérable hébergé par Acunetix.

La requête HTTP suivante est une requête normale qu'un utilisateur légitime enverrait :

Le paramètre artist est vulnérable à l'injection SQL. La charge utile suivante modifie la requête pour rechercher un enregistrement inexistant. Il définit la valeur dans la chaîne de requête URL sur -1 . Bien sûr, il peut s'agir de toute autre valeur qui n'existe pas dans la base de données. Cependant, une valeur négative est une bonne estimation car un identifiant dans une base de données est rarement un nombre négatif.

En injection SQL, l'opérateur UNION est couramment utilisé pour attacher une requête SQL malveillante à la requête d'origine destinée à être exécutée par l'application Web. Le résultat de la requête injectée sera joint au résultat de la requête d'origine. Cela permet à l'attaquant d'obtenir les valeurs des colonnes d'autres tables.

L'exemple suivant montre comment une charge utile d'injection SQL pourrait être utilisée pour obtenir des données plus significatives à partir de ce site intentionnellement vulnérable :


Exemple de code vulnérable

Avant d'aborder concrètement cette technique d'injection, voyons d'abord rapidement ce qu'est l'injection SQL. Supposons que nous ayons une application Web qui utilise l'article de paramètre via AJAX pour exécuter des instructions SQL PostGIS et afficher les résultats via GeoServer - Geographic Information Systems,[nobr][H1toH2]

Questions fréquemment posées

Quel est le pire qui puisse arriver en raison d'une injection SQL ?

Une injection SQL peut entraîner la perte de données confidentielles, y compris des données client, ce qui peut affecter la conformité et entraîner d'énormes amendes. Une injection SQL peut également conduire à une compromission complète du système (comme décrit dans cet article).

Comment savoir si j'ai été victime d'une attaque par injection SQL ?

Si vous pensez avoir été victime d'une injection SQL, commencez par vérifier vos applications à l'aide d'un scanner de vulnérabilité Web comme Acunetix pour confirmer qu'il existe une vulnérabilité. Si vous confirmez qu'il existe une vulnérabilité et que vous soupçonnez qu'un attaquant l'a utilisée, vous devez effectuer une analyse manuelle de votre système.

Comment empêcher les injections SQL dans mes applications ?

Pour empêcher les injections SQL, l'application ne doit jamais inclure directement l'entrée de l'utilisateur dans les requêtes. Au lieu de cela, tous les développeurs doivent utiliser des requêtes paramétrées (instructions préparées) et/ou des procédures stockées.

Où puis-je trouver plus d'informations sur les injections SQL ?

Le site Acunetix contient des tonnes d'informations sur toutes les variantes de SQL Injection. En effet, Acunetix s'est toujours fortement attaché à vous aider à prévenir cette vulnérabilité critique. Recherchez simplement sur notre site pour en savoir plus.


Contraintes de table

Les contraintes de table sont identifiées par le mot clé CONSTRAINT et peuvent être utilisées pour implémenter diverses contraintes décrites ci-dessous.

Contrainte d'IDENTITÉ

Nous pouvons utiliser la contrainte de colonne facultative IDENTITY pour fournir une valeur incrémentielle unique pour cette colonne. Les colonnes d'identité sont souvent utilisées avec les contraintes PRIMARY KEY pour servir d'identifiant de ligne unique pour la table. La propriété IDENTITY peut être affectée à une colonne avec un type de données tinyint, smallint, int, decimal ou numérique. Cette contrainte :

  • Génère des nombres séquentiels
  • N'applique pas l'intégrité de l'entité
  • Une seule colonne peut avoir la propriété IDENTITY
  • Doit être défini comme un type de données entier, numérique ou décimal
  • Impossible de mettre à jour une colonne avec la propriété IDENTITY
  • Ne peut pas contenir de valeurs NULL
  • Impossible de lier les valeurs par défaut et les contraintes par défaut à la colonne

Pour IDENTITY[(graine, incrément)]

  • Seed - la valeur initiale de la colonne d'identité
  • Incrément – ​​la valeur à ajouter à la dernière colonne d'incrément

Nous utiliserons un autre exemple de base de données pour illustrer davantage les instructions SQL DDL en créant la table tblHotel dans cette base de données HOTEL.

La contrainte UNIQUE empêche la saisie de valeurs en double dans une colonne.

  • Les contraintes PK et UNIQUE sont utilisées pour appliquer l'intégrité de l'entité.
  • Plusieurs contraintes UNIQUE peuvent être définies pour une table.
  • Lorsqu'une contrainte UNIQUE est ajoutée à une table existante, les données existantes sont toujours validées.
  • Une contrainte UNIQUE peut être placée sur les colonnes qui acceptent les valeurs NULL. OUne seule ligne peut être NULL.
  • Une contrainte UNIQUE crée automatiquement un index unique sur la colonne sélectionnée.

Voici la syntaxe générale de la contrainte UNIQUE :

Ceci est un exemple utilisant la contrainte UNIQUE.

Contrainte FOREIGN KEY

La contrainte FOREIGN KEY (FK) définit une colonne, ou une combinaison de colonnes, dont les valeurs correspondent à la PRIMARY KEY (PK) d'une autre table.

  • Les valeurs d'un FK sont automatiquement mises à jour lorsque les valeurs PK du tableau associé sont mises à jour/modifiées.
  • Les contraintes FK doivent référencer PK ou la contrainte UNIQUE d'une autre table.
  • Le nombre de colonnes pour FK doit être le même que la contrainte PK ou UNIQUE.
  • Si l'option WITH NOCHECK est utilisée, la contrainte FK ne validera pas les données existantes dans une table.
  • Aucun index n'est créé sur les colonnes qui participent à une contrainte FK.

Voici la syntaxe générale de la contrainte FOREIGN KEY :

Dans cet exemple, le champ HotelNo dans la table tblRoom est un FK pour le champ HotelNo dans la table tblHotel montrée précédemment.

CHECK contrainte

La contrainte CHECK restreint les valeurs qui peuvent être saisies dans une table.

  • Elle peut contenir des conditions de recherche similaires à une clause WHERE.
  • Il peut référencer des colonnes dans la même table.
  • La règle de validation des données pour une contrainte CHECK doit être évaluée en une expression booléenne.
  • Il peut être défini pour une colonne à laquelle une règle est liée.

Voici la syntaxe générale de la contrainte CHECK :

Dans cet exemple, le champ Type est limité aux seuls types ‘Single’, ‘Double’, ‘Suite’ ou ‘Executive’.

Dans ce deuxième exemple, la date d'embauche de l'employé doit être antérieure au 1er janvier 2004 ou avoir une limite de salaire de 300 000 $.

Contrainte DEFAULT

La contrainte DEFAULT est utilisée pour fournir une valeur qui est automatiquement ajoutée pour une colonne si l'utilisateur n'en fournit pas.

  • Une colonne ne peut avoir qu'un seul DEFAULT.
  • La contrainte DEFAULT ne peut pas être utilisée sur les colonnes avec un type de données d'horodatage ou une propriété d'identité.
  • Les contraintes DEFAULT sont automatiquement liées à une colonne lors de leur création.

La syntaxe générale de la contrainte DEFAULT est :

Cet exemple définit la valeur par défaut du champ de la ville sur ‘Vancouver’.


Testez la prise en charge JSON intégrée avec l'exemple de base de données AdventureWorks

Pour obtenir l'exemple de base de données AdventureWorks, téléchargez au moins le fichier de base de données et le fichier d'exemples et de scripts à partir de GitHub.

Après avoir restauré l'exemple de base de données sur une instance de SQL Server 2016, extrayez le fichier d'exemples, puis ouvrez le Vues des procédures d'exemples de requêtes JSON et indexes.sql fichier du dossier JSON. Exécutez les scripts de ce fichier pour reformater certaines données existantes en tant que données JSON, tester des exemples de requêtes et de rapports sur les données JSON, indexer les données JSON et importer et exporter JSON.

Voici ce que vous pouvez faire avec les scripts inclus dans le fichier :

Dénormalisez le schéma existant pour créer des colonnes de données JSON.

Stockez les informations de SalesReasons, SalesOrderDetails, SalesPerson, Customer et d'autres tables contenant des informations relatives à la commande client dans les colonnes JSON de la table SalesOrder_json.

Stockez les informations des tables EmailAddresses/PersonPhone dans la table Person_json sous forme de tableaux d'objets JSON.

Créez des procédures et des vues qui interrogent les données JSON.

Indexez les données JSON. Créez des index sur les propriétés JSON et les index de texte intégral.

Importez et exportez JSON. Créez et exécutez des procédures qui exportent le contenu des tables Person et SalesOrder en tant que résultats JSON, et importez et mettez à jour les tables Person et SalesOrder à l'aide de l'entrée JSON.

Exécutez des exemples de requêtes. Exécutez des requêtes qui appellent les procédures stockées et les vues que vous avez créées aux étapes 2 et 4.

Nettoyer les scripts. N'exécutez pas cette partie si vous souhaitez conserver les procédures stockées et les vues que vous avez créées aux étapes 2 et 4.


Voir la vidéo: Importer une base de donnée PostGIS dans Geoserver