{"id":6214,"date":"2026-11-04T13:05:56","date_gmt":"2026-11-04T12:05:56","guid":{"rendered":"https:\/\/gpmfactory.com\/?p=6214"},"modified":"2026-11-04T13:12:35","modified_gmt":"2026-11-04T12:12:35","slug":"generateur-de-formulaires-pour-oracle-apex","status":"publish","type":"post","link":"https:\/\/gpmfactory.com\/index.php\/2026\/11\/04\/generateur-de-formulaires-pour-oracle-apex\/","title":{"rendered":"G\u00e9n\u00e9rateur de formulaires pour Oracle APEX"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">GFM Designer <\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Nov 4, 2026 \u00b7 @Patrick<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GFM Designer permet \u00e0 des utilisateurs non d\u00e9veloppeurs de concevoir des formulaires de saisie par glisser-d\u00e9poser, puis de les publier en un clic sous forme de pages Oracle APEX. Il succ\u00e8de \u00e0 <a href=\"https:\/\/gpmfactory.com\/index.php\/2022\/09\/27\/form-builder-tool-for-oracle-apex\/\" data-type=\"link\" data-id=\"https:\/\/gpmfactory.com\/index.php\/2022\/09\/27\/form-builder-tool-for-oracle-apex\/\">GFM Builder<\/a>, un g\u00e9n\u00e9rateur que j&rsquo;avais \u00e9crit il y a plusieurs ann\u00e9es, enti\u00e8rement dans APEX.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le principe n&rsquo;a pas chang\u00e9 : on d\u00e9crit le formulaire dans des tables de m\u00e9tadonn\u00e9es, un package PL\/SQL fabrique la page APEX correspondante. Ce qui a chang\u00e9, c&rsquo;est la mani\u00e8re de concevoir les formulaires et l&rsquo;architecture qui la porte. Cet article raconte cette \u00e9volution et se termine par un petit guide utilisateur.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La version pr\u00e9c\u00e9dente<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GFM Builder \u00e9tait une application APEX classique. On y saisissait les formulaires, leurs sections et leurs champs dans des \u00e9crans de type rapport et formulaire. Un bouton lan\u00e7ait ensuite le package <code>gfm_builder<\/code>, qui cr\u00e9ait la page dans l&rsquo;application h\u00f4te en appelant les API internes d&rsquo;APEX, exactement comme le fait un import.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cela fonctionnait, mais trois limites sont apparues avec le temps :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>La conception \u00e9tait laborieuse.<\/strong> Placer un champ, changer l&rsquo;ordre des sections ou la largeur d&rsquo;une zone passait par des \u00e9crans de saisie et des num\u00e9ros de s\u00e9quence. Rien de visuel pour des utilisateurs qui ne sont pas d\u00e9veloppeurs.<\/li>\n\n\n\n<li><strong>Les mont\u00e9es de version d&rsquo;APEX cassaient la g\u00e9n\u00e9ration.<\/strong> Les API utilis\u00e9es (<code>wwv_flow_api<\/code>) ne sont pas document\u00e9es. <\/li>\n\n\n\n<li><strong>Le code avait vieilli.<\/strong> Un package d&rsquo;un seul tenant, peu document\u00e9, avec des dates stock\u00e9es en texte et des choix de colonnes fig\u00e9s.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">La nouvelle architecture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La conception quitte APEX : elle se fait dans un client web ind\u00e9pendant, qui ne parle \u00e0 la base qu&rsquo;au travers d&rsquo;une API REST. La saisie, elle, reste dans les pages APEX g\u00e9n\u00e9r\u00e9es.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6aeb495df357c&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6aeb495df357c\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"463\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1024x463.png\" alt=\"\" class=\"wp-image-6215\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1024x463.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-767x347.png 767w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-300x136.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image.png 1344w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le concepteur et l&rsquo;utilisateur de saisie ne passent jamais par le m\u00eame chemin : l&rsquo;un modifie des m\u00e9tadonn\u00e9es via l&rsquo;API, l&rsquo;autre saisit des donn\u00e9es dans APEX.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Le client<\/strong> est \u00e9crit en JavaScript et Bootstrap 5, sans \u00e9tape de compilation. SortableJS assure le glisser-d\u00e9poser. Il peut \u00eatre servi depuis n&rsquo;importe o\u00f9, y compris GitHub Pages.<\/li>\n\n\n\n<li><strong>ORDS<\/strong> expose le module REST <code>gfm.designer<\/code>. L&rsquo;acc\u00e8s est prot\u00e9g\u00e9 par OAuth2 : flux \u00ab code d&rsquo;autorisation \u00bb avec PKCE, et un r\u00f4le d\u00e9di\u00e9 aux concepteurs.<\/li>\n\n\n\n<li><strong>Le package <code>gfm_api<\/code><\/strong> re\u00e7oit les appels, contr\u00f4le les r\u00e8gles m\u00e9tier et renvoie le formulaire complet en JSON apr\u00e8s chaque modification. Le client n&rsquo;a plus qu&rsquo;\u00e0 le redessiner.<\/li>\n\n\n\n<li><strong>Le package <code>gfm_builder<\/code><\/strong>, refondu et document\u00e9, garde ses signatures publiques. Il cr\u00e9e les vues et les pages dans l&rsquo;application h\u00f4te.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Toutes les donn\u00e9es et toute la logique restent dans Oracle. Le client ne stocke rien, \u00e0 part le jeton de session.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Stockage g\u00e9n\u00e9rique et pages g\u00e9n\u00e9r\u00e9es<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tous les formulaires enregistrent leurs donn\u00e9es dans une seule table, <code>GFM_DATA<\/code>, sans aucune cr\u00e9ation de table par formulaire. Elle offre des colonnes \u00ab emplacements \u00bb de trois types :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Colonnes<\/th><th>Usage<\/th><\/tr><\/thead><tbody><tr><td>Texte<\/td><td>C001 \u00e0 C050<\/td><td>champs texte, listes, zones de texte<\/td><\/tr><tr><td>Nombre<\/td><td>N001 \u00e0 N020<\/td><td>champs num\u00e9riques ; N001 sert de cl\u00e9 vers la ligne parente d&rsquo;une grille<\/td><\/tr><tr><td>Date<\/td><td>D001 \u00e0 D020<\/td><td>dates, stock\u00e9es enfin en vrai type DATE<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 la g\u00e9n\u00e9ration, chaque champ re\u00e7oit un emplacement libre du bon type, et deux vues donnent un visage lisible aux donn\u00e9es :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>G$_&lt;CODE&gt;<\/code> porte le formulaire de saisie, avec un d\u00e9clencheur <code>INSTEAD OF<\/code> qui \u00e9crit dans <code>GFM_DATA<\/code> ;<\/li>\n\n\n\n<li><code>G$_&lt;CODE&gt;_R<\/code> alimente le rapport, avec les libell\u00e9s des listes et les colonnes d&rsquo;audit (cr\u00e9\u00e9 le, par, modifi\u00e9 le, par).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Pour un formulaire, le package produit deux pages dans l&rsquo;application h\u00f4te :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Une page de saisie<\/strong> : sections en onglets, en r\u00e9gions ou avec un s\u00e9lecteur, champs typ\u00e9s, champs et sections conditionnels, grilles \u00e9ditables pour les sous-formulaires.<\/li>\n\n\n\n<li><strong>Un rapport interactif<\/strong> sur la vue <code>_R<\/code>, avec un bouton \u00ab Nouveau \u00bb et un lien vers chaque fiche.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s \u00ab Submit \u00bb, l&rsquo;utilisateur est redirig\u00e9 vers une page <code>END<\/code> de l&rsquo;application h\u00f4te. Le package appelle d\u00e9sormais directement <code>wwv_flow_imp_page<\/code>, l&rsquo;API qu&rsquo;utilisent les exports d&rsquo;APEX 26.1, ce qui a fait dispara\u00eetre les erreurs de contraintes. Par prudence, une page existante n&rsquo;est remplac\u00e9e que si elle a bien \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9e pour ce formulaire.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Guide utilisateur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GFM Designer s&rsquo;ouvre dans un navigateur. Le menu du haut donne acc\u00e8s \u00e0 trois \u00e9crans : <strong>Formulaires<\/strong>, <strong>Composants<\/strong> et <strong>Param\u00e8tres<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Se connecter<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cliquez sur \u00ab Se connecter \u00bb. Vous \u00eates redirig\u00e9 vers la page de connexion de la base, puis ramen\u00e9 dans le designer. Seuls les comptes qui ont le r\u00f4le de concepteur y ont acc\u00e8s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Choisir l&rsquo;application h\u00f4te (une fois)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dans <strong>Param\u00e8tres<\/strong>, choisissez l&rsquo;application APEX qui recevra les pages g\u00e9n\u00e9r\u00e9es. Seules les applications du groupe APEX \u00ab GFM Apps \u00bb sont propos\u00e9es. Si vous changez d&rsquo;application, les formulaires devront \u00eatre g\u00e9n\u00e9r\u00e9s \u00e0 nouveau.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Cr\u00e9er un formulaire<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dans <strong>Formulaires<\/strong>, cliquez sur \u00ab Nouveau formulaire \u00bb, donnez-lui un nom et choisissez son type :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Formulaire<\/strong> : une page de saisie APEX avec son rapport ;<\/li>\n\n\n\n<li><strong>Grille<\/strong> : un tableau \u00e9ditable destin\u00e9 \u00e0 \u00eatre inclus dans un formulaire, par exemple un historique ;<\/li>\n\n\n\n<li><strong>Bloc<\/strong> : un groupe de champs r\u00e9utilisable, comme une adresse, qui n&rsquo;est jamais g\u00e9n\u00e9r\u00e9 seul.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4. Construire le formulaire par glisser-d\u00e9poser<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;\u00e9diteur affiche la palette \u00e0 gauche, le formulaire au centre et les propri\u00e9t\u00e9s \u00e0 droite.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ajouter une section<\/strong> : glissez \u00ab Section \u00bb dans la zone des sections. Les sections deviennent des onglets dans la page g\u00e9n\u00e9r\u00e9e.<\/li>\n\n\n\n<li><strong>Ajouter un champ<\/strong> : glissez un composant (Text Field, Number, Date, liste\u2026) dans une section, \u00e0 l&rsquo;endroit voulu.<\/li>\n\n\n\n<li><strong>Ins\u00e9rer un bloc ou une grille<\/strong> : glissez-le depuis les groupes \u00ab Blocs \u00bb ou \u00ab Sous-formulaires \u00bb. Les champs d&rsquo;un bloc sont copi\u00e9s dans la section.<\/li>\n\n\n\n<li><strong>R\u00e9organiser<\/strong> : faites glisser les champs et les sections. Tout est enregistr\u00e9 imm\u00e9diatement.<\/li>\n\n\n\n<li><strong>Changer la largeur<\/strong> : tirez le bord droit d&rsquo;un champ. Une ligne compte au plus 12 colonnes, soit deux demi-lignes ou trois tiers.<\/li>\n\n\n\n<li><strong>Supprimer<\/strong> : glissez l&rsquo;\u00e9l\u00e9ment sur la corbeille en bas de la palette.<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6aeb495df3f26&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6aeb495df3f26\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"565\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1-1024x565.png\" alt=\"\" class=\"wp-image-6219\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1-1024x565.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1-300x166.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1-766x423.png 766w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1-1536x848.png 1536w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2026\/11\/image-1-2048x1131.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">5. R\u00e9gler les propri\u00e9t\u00e9s<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cliquez sur un champ pour modifier son libell\u00e9, son aide, son caract\u00e8re obligatoire, son ic\u00f4ne ou les valeurs d&rsquo;une liste. La rubrique <strong>Affichage conditionnel<\/strong> permet de n&rsquo;afficher un champ, ou une section enti\u00e8re, que si un autre champ est renseign\u00e9 ou prend une valeur pr\u00e9cise.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. G\u00e9rer les listes de valeurs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;\u00e9cran <strong>Composants<\/strong> regroupe les listes partag\u00e9es. On y ajoute, renomme et r\u00e9ordonne les valeurs par glisser-d\u00e9poser, ou on les colle depuis un tableur. Une liste modifi\u00e9e ici profite \u00e0 tous les formulaires qui l&rsquo;utilisent.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. G\u00e9n\u00e9rer et tester<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cliquez sur <strong>G\u00e9n\u00e9rer<\/strong>. Le designer v\u00e9rifie d&rsquo;abord le formulaire : une liste sans valeur ou une ligne trop large est signal\u00e9e par un triangle et bloque la g\u00e9n\u00e9ration. Une fois la page cr\u00e9\u00e9e, le bouton <strong>Ouvrir la page<\/strong> l&rsquo;affiche dans APEX, pr\u00eate pour une nouvelle saisie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Toute modification ult\u00e9rieure demande une nouvelle g\u00e9n\u00e9ration. Les donn\u00e9es d\u00e9j\u00e0 saisies sont conserv\u00e9es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce que j&rsquo;en retiens, et la suite<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e9parer la conception de la g\u00e9n\u00e9ration a tout simplifi\u00e9 : l&rsquo;interface peut \u00e9voluer librement, et le PL\/SQL reste concentr\u00e9 sur ce qu&rsquo;il fait bien, dans la base. Quelques le\u00e7ons au passage :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Les API internes d&rsquo;APEX restent le point fragile.<\/strong> Se caler sur ce que produisent les exports de la version courante est la meilleure garantie.<\/li>\n\n\n\n<li><strong>Une application dans le navigateur ne garde aucun secret.<\/strong> La vraie protection, c&rsquo;est l&rsquo;adresse de retour enregistr\u00e9e, PKCE et le r\u00f4le de l&rsquo;utilisateur.<\/li>\n\n\n\n<li><strong>Un serveur de d\u00e9mo sans d\u00e9pendance<\/strong>, qui imite l&rsquo;API, permet de tester l&rsquo;interface sans base.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Plusieurs pistes sont ouvertes : la port\u00e9e et la publication des formulaires (public, groupe, priv\u00e9), d\u00e9j\u00e0 pr\u00e9sentes dans l&rsquo;interface, et, plus loin, un moteur qui afficherait les formulaires \u00e0 la vol\u00e9e sans g\u00e9n\u00e9rer de pages APEX.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GFM Designer Nov 4, 2026 \u00b7 @Patrick Introduction GFM Designer permet \u00e0 des utilisateurs non d\u00e9veloppeurs de concevoir des formulaires de saisie par glisser-d\u00e9poser,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_ppma_block_editor_authors":""},"categories":[1],"tags":[],"ppma_author":[150],"class_list":["post-6214","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"authors":[{"term_id":150,"user_id":1,"is_guest":0,"slug":"admin8700","display_name":"Patrick","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/41853cbf3fae9c0c46c0ba5e68839a78c20aabbcd1db74702bbda2c9d3980676?s=96&d=mm&r=g","author_category":"","first_name":"Patrick","last_name":"Monaco","user_url":"","job_title":"","description":"GPM Factory"}],"_links":{"self":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/6214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/comments?post=6214"}],"version-history":[{"count":7,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/6214\/revisions"}],"predecessor-version":[{"id":6223,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/6214\/revisions\/6223"}],"wp:attachment":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/media?parent=6214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/categories?post=6214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/tags?post=6214"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/ppma_author?post=6214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}