Échanges avec un logiciel de gestion de demandes «mĂ©tier»

Échanges avec un logiciel de gestion de demandes «mĂ©tier»¶

Un cas habituel de logiciel tiers est celui qui traite des demandes «métier», par exemple des signalements de problÚmes sur la voiries ou des demandes d'intervention concernant la gestion des eaux.

Un tel logiciel peut ĂȘtre connectĂ© avec Publik afin que :
  • un usager puisse envoyer une demande (un signalement) vers le logiciel
  • par la suite, qu'il puisse ĂȘtre informĂ© de l'avancement de sa demande (prise en charge, traitement en cours, etc.)

Pour mettre en place cette connexion, le logiciel doit exposer un certains nombres de webservices à disposition de Publik. Cette documentation les décrit.

Principes des échanges¶

Publik créé la demande dans le logiciel tiers : les données de la demande et les documents liés si nécessaire.

Publik interroge ensuite le logiciel pour connaßtre le statut de la demande. Ce statut est éventuellement accompagné d'informations complémentaires.

Selon les informations reçues, Publik informe l'usager de l'avancement de sa demande, par courriel, SMS, message à l'écran ou tout autre moyen.

Publik rĂ©pĂšte cette interrogation toutes les 6 ou 12h, jusqu'Ă  ce que la demande atteigne un statut «final». Les Ă©changes la concernant s'arrĂȘtent alors.

Création d'une demande dans le logiciel tiers¶

Une fois la demande saisie par l'usager, Publik l'envoie dans le logiciel métier. Pour cela, un appel HTTP POST est fait vers une URL proposée par le logiciel, dans notre exemple https://logiciel.tiers/api/creation-nouvelle-demande, mais tout autre format d'URL est possible.

Cet appel POST envoie un dictionnaire JSON, à plat, contenant une suite de clés-valeurs :

POST https://logiciel.tiers/api/creation-nouvelle-demande
Content-Type: application/json
Accept: application/json

{
  "info1": "valeur1",
  "info2": "valeur2",
  "info3": "valeur3",
  "info4": "valeur4",
  ...
}

Noter que le formulaire n'est pas envoyĂ© tel quel, tel que saisi par l'usager : certains champs peuvent ĂȘtre modifiĂ©s, adaptĂ©s, transformĂ©s ou normalisĂ©s. Par exemple, si l'usager a choisi la ville "Grenoble" dans la liste, c'est son code INSEE qui peut ĂȘtre envoyĂ© dans le logiciel (cf plus bas la gestion des rĂ©fĂ©rentiels). C'est donc au logiciel tiers de dĂ©crire l'ensemble des donnĂ©es dont il a besoin pour crĂ©er une demande : le formulaire Publik sera adaptĂ© pour les obtenir de l'usager, et la traduction technique prĂ©cise sera faire lors de l'appel HTTP POST.

Attention : par dĂ©faut pour chaque "valeurX", Publik ne sait envoyer que des chaĂźnes de caractĂšres. Ainsi, si des nombres doivent ĂȘtre transmis, ils le seront sous forme de chaĂźne de caractĂšre. D'autres types de donnĂ©es peuvent ĂȘtre possibles, mais il convient alors de vĂ©rifier que Publik peut les gĂ©rĂ©r.

En retour, Publik attend un dictionnaire avec deux entrées :
  • err : doit ĂȘtre Ă  0 (le nombre entier 0) en cas d'absence d'erreur
  • data : contient toute les donnĂ©es nĂ©cessaires Ă  la suite du traitement. Ça sera en gĂ©nĂ©ral la rĂ©fĂ©rence de la demande créée dans le logiciel, rĂ©fĂ©rence qui sera utilisĂ©e par Publik pour les communications ultĂ©rieures relative Ă  cette demande.

Exemple de réponse attendue :

POST https://logiciel.tiers/api/creation-nouvelle-demande
(... dictionnaire JSON de la demande à créer ...)

200 OK
Content-Type: application/json

{
  "err": 0,
  "data": {
     "numero": "42",
     "url": "https://logiciel.tiers/api/demande/42/",
     "statut": "demande créée",
     "datetime": "2021-09-09T15:20:12" 
  }
}

Publik va stocker toutes ces informations dans la demande. L'élément important et nécessaire ici est numero, qui sera la référence dans le logiciel.

En cas de problĂšme, la rĂ©ponse sera du mĂȘme format mais avec un err Ă  1 (ou toute autre valeur diffĂ©rente du nombre 0) : lire la section sur la gestion de erreur plus bas dans ce document.

Ajout de document sur une demande créée¶

Une fois la demande créée, Publik peut y joindre les documents. Les documents sont envoyés en dehors de la création de la demande, et un par un : l'objectif est d'éviter tout engorgement, car il s'agit souvent de documents volumineux qui peuvent subir un filtrage par un équipement réseau entre Publik et le logiciel.

Pour chaque document, une requĂȘte HTTP POST est effectuĂ©e qui contient une rĂ©fĂ©rence Ă  la demande créée. Par exemple :

POST https://logiciel.tiers/api/document-pour-demande/42/
Content-Type: application/json
Accept: application/json

{
  "document": {
     "filename": "nomdufichier.pdf",
     "content_type": "application/pdf",
     "content": "Y2VjaSBlc3QgdW4gZXhlbXBsZSBkZSBiYXNlNjQK..." 
  },
  "type": "passeport",
}

Le fichier est sérialisé dans une clé document. Le contenu du fichier est envoyé dans content encodé en base64, le nom du fichier est filename et son type MIME est dans content_type. Ce format filename+content_type+content est imposé par Publik et n'est pas modifiable.

Dans l'exemple ci-dessus, un type est indiqué qui permet au logiciel métier de savoir de quel document il s'agit. D'autres informations peuvent accompagner le document, selon ce qui est nécessaire au logiciel.

Le numĂ©ro de la demande pour laquelle le fichier est envoyĂ© (ici 42) peut ĂȘtre indiquĂ© :
  • soit dans l'URL du POST, comme dans l'exemple
  • soit dans la query-string, on aurait ici /api/document-pour-demande/?demande=42
  • soit dans le dictionnaire JSON

En retour de cet appel HTTP POST, Publik attend un dictionnaire avec au moins une entrée err à 0 (le nombre entier), et éventuellement des informations supplémentaires dans une clé data, par exemple :

200 OK
Content-Type: application/json

{
  "err": 0,
  "data": null
}

Comme pour la création de la demande, en cas d'erreur la réponse sera identique mais avec err à 1 (ou toute autre valeur différente du nombre 0) : voire la section sur la gestion d'erreurs plus bas dans ce document.

Remontée du statut d'une demande dans Publik¶

Une fois la demande créée dans le logiciel, elle va y ĂȘtre traitĂ©e.

Publik va rĂ©guliĂšrement interroger son statut, par exemple toutes les 6 heures, en effectuant une requĂȘte HTTP GET telle que :

GET https://logiciel.tiers/api/statut-demande/42/
Accept: application/json

Le numĂ©ro de la demande peut ĂȘtre dans l'URL comme dans cet exemple, ou dans la querystring et on aurait alors par exemple /api/statut-demande/?demande=42.

En retour de cet appel HTTP GET, Publik attend un dictionnaire avec deux entrées err et data : c'est dans data que sont les informations de statut de la demande.

Exemple de réponse attendue :

Content-Type: application/json

{
  "err": 0,
  "data": {
     "statut": "traitement-en-cours",                          # code du statut
     "statut_label": "Demande en cours de traitement"          # nom affiché à l'usager
     "commentaire": "Votre demande sera traitée le 15/01/2021"    
  }
}

Pour savoir réagir dans toutes les situations, Publik devra connaßtre tous les statuts possibles, pour savoir ce qu'il doit faire de son cÎté : informer l'usager, clÎturer la demande, etc.

Exemples de statuts que l'on peut imaginer (mais c'est le logiciel qui spécifiera la liste exacte selon son «métier») :
  • refus
  • traitement-en-cours
  • cloture

Publik interroge réguliÚrement le statut de la demande, jusqu'à obtenir un statut final (par exemple "clos" ou "refus"). Le délai entre chaque interrogation est paramétrable dans Publik, c'est souvent 6h ou 12h, et ce pour chaque demande qui n'est pas encore clÎturée.

Commentaires lors du traitement dans le logiciel tiers¶

Pendant le traitement de la demande, les agents peuvent éventuellement indiquer des commentaires destinés à l'usager.

Pour faire cela, lors de chaque interrogation du statut de la demande, Publik vérifie si le commentaire a changé. Si oui, alors il le communique à l'usager (par mail, sms, message à l'écran, selon l'action configurée dans Publik).

SystÚme en mode «push» : déclenchements par le logiciel tiers¶

Dans ce qui est décrit ci-dessus, c'est Publik qui vient réguliÚrement demander au logiciel tiers le statut des demandes en cours. Cela présente plusieurs inconvénients :
  • si 300 demandes sont en cours, Publik va faire 300 requĂȘtes
  • le dĂ©lai entre chaque requĂȘte sur une demande sera de plusieurs heures (souvent 6 et 12) et ne permet pas donc pas rĂ©action rapide du Publik
  • si la demande a changĂ© plusieurs fois de statut dans l'intervalle, Publik peut avoir ratĂ© les Ă©tapes transitoires cela peut compliquer la comprĂ©hension par l'usager de l'avancement de sa demande

Si le nombre de de demandes est important ou si la rĂ©activitĂ© doit ĂȘtre grande, c'est plutĂŽt le logiciel tiers qui doit informer de l'avancement des demandes.

Pour cela, le logiciel tiers peut dĂ©clencher des appels «_trigger_» sur Publik, sous forme de requĂȘte POST, selon ce format :

POST https://demarches.example.net/<slug-demarche>/<numero-de-demande>/jump/trigger/<declencheur>/
{
  "information": ...
}

Cet appel va demander Ă  Publik que la demande de type <slug-demarche>, numĂ©ro <numero-de-demande>, effectue un saut nommĂ© <declencheur>. Ce saut est programmĂ© dans Publik, dans le workflow de la dĂ©marche concernĂ©e. Au passage, le logiciel pourra fournir des informations supplĂ©mentaires dans un dictionnaire JSON, qui seront enregistrĂ©e dans la demande Publik. Ces donnĂ©es pourront ensuite ĂȘtre exploitĂ©es dans le workflow, par exemple pour alimenter une donnĂ©e de traitement.

Plus de détails sur ce principe de traitement : https://doc-publik.entrouvert.com/dev/wcs/api-webservices/traitement-d-un-formulaire/

Ce mécanisme impose que le logiciel tiers détermine les URL à appeler. Pour cela, il devra connaßtre les codes <declencheur> possibles, et les appeler au moment opportun. Il doit aussi avoir reçu <slug-demarche> et <numero-de-demande> dans le JSON de la création de la demande.

Enfin, en mode «push», le logiciel tiers doit tracer (loguer) les appels qu'il effectue. Il doit savoir retenter un appel qui a Ă©chouĂ© sur une erreur non fatale (erreur rĂ©seau, DNS, code HTTP 5xx, etc.). Il doit savoir lever une alerte en cas d'erreur fatale afin de pouvoir dĂ©boguer les problĂšmes le plus rapidement possible. (Pour information, comme pour toute requĂȘte, Publik ne logue que les mĂ©tadonnĂ©es, donc ni le contenu des appels reçus, ni celui de la rĂ©ponse envoyĂ©e.)

Référentiels, listes de choix¶

Le formulaire présenté à l'usager par Publik comporte souvent des champs de type listes. L'usager doit choisir un ou des éléments dans ces listes. Ces choix sont nécessaires à la création de la demande dans le logiciel métier, par exemple le type d'intervention, la nature du signalement, etc.

Le logiciel tiers doit fournir à Publik le contenu de ses listes. Comme exemple on imagine le cas d'un formulaire de demande d'intervention dans une école située sur le territoire d'une agglomération : le formulaire affichera les listes suivantes :
  • les villes
  • les Ă©tablissements concernant la ville sĂ©lectionnĂ©e

Pour chaque liste, Publik interroge un webservice de référentiel, dans cet exemple on aurait :

La réponse à un référentiel est un document JSON de type dictionnaire, avec deux entrées :
  • err : un code d'erreur, Ă©gal Ă  0 (le nombre entier 0) quand tout se passe bien (voir en fin de document pour la gestion des erreurs)
  • data: la liste des items du rĂ©fĂ©rentiel, chaque item Ă©tant un dictionnaire contenant :
    • id : identifiant unique de l'item
    • text: texte affichĂ© Ă  l'usager, typiquement dans une liste affichĂ©e sur le formulaire
    • toute autre information utile Ă  afficher Ă  l'usager ou Ă  envoyer ensuite au logiciel dans la demande

Exemple d'une réponse simple pour la liste des villes, avec juste id et text pour chacune :

GET https://logiciel.tiers/api/referentiel/villes

200 OK
Content-Type: application/json

{
  "err": 0,
  "data": [
    {
      "id": "38185",
      "text": "Grenoble",
    },
    {
      "id": "38544",
      "text": "Vienne" 
    }
    (... les autres villes ...)
  ]
}

Mais on peut aussi ajouter d'autres détails sur chaque entrée, par exemple le code postal principal de chaque ville :

GET https://logiciel.tiers/api/referentiel/villes

200 OK
Content-Type: application/json

{
  "err": 0,
  "data": [
    {
      "id": "38185",
      "text": "Grenoble",
      "code_postal": "38000",
    },
    {
      "id": "38544",
      "text": "Vienne" 
      "code_postal": "38200",
    }
    (... autres villes ...)
  ]
}

À noter que les Ă©lĂ©ments des listes doivent ĂȘtre triĂ©s dans l'ordre Ă  afficher aux usagers, Publik ne re-trie pas les listes qu'il reçoit.

Usage des données reçues¶

Publik affiche sur le formulaire la liste des text, dans l'exemple ci-dessus ça sera Grenoble, Vienne, etc. Quand l'usager fait son choix dans cette liste, alors Publik dispose de toutes les informations liées à ce choix. Par exemple si l'usager choisi Vienne, Publik connaitra les valeurs suivantes :
  • le nom de la ville choisie : "Vienne" (clĂ© text)
  • le code INSEE de cette ville : "38544" (clĂ© id)
  • et son code postal : "38200" (clĂ© code_postal)

Toutes ces informations sont stockĂ©es et donc partie de la demande Publik. Elles peuvent toutes ĂȘtre utilisĂ©es pour communiquer ensuite avec le logiciel tiers lors de la crĂ©ation de la demande.

Ainsi, au lieu d'envoyer le nom "Vienne" au logiciel tiers qui devrait retrouver à quelle ville sa correspond dans sa base, Publik peut lui envoyer directement le code INSEE de la ville concernée "38544". Ce partage de référentiels permet donc une communication plus efficace entre Publik et le logiciel.

Filtrage des éléments d'un référentiel¶

Pour certaines listes, on voudra les restreindre en fonction de certains critÚres. Dans notre exemple on cherche à afficher les établissements d'une ville en particulier. Pour faire cela, Publik ajoute un critÚre dans l'URL lorsqu'il interroge le référentiel des établissements : GET https://logiciel.tiers/api/referentiel/etablissements?code_ville=38000

La rĂ©ponse obĂ©it strictement au mĂȘme format que pour la liste complĂšte des Ă©tablissements, mais seuls les Ă©tablissements de la ville concernĂ©e sont prĂ©sents dans data.

Liste en mode auto-complétion¶

Quand une liste contient plusieurs dizaines d'éléments, elle est trop longue à afficher dans un formulaire. Publik peut en proposer l'affichage en mode auto-complétion : l'usager doit taper quelques lettres et Publik affiche les éléments de la liste qui les contiennent.

Pour cela, le webservice référentiel concerné doit réagir à deux paramÚtres supplémentaires : q pour filtrer en fonction de ce que l'usager a tapé, et id pour remonter les informations du choix fait par l'usager.

  • GET https://logiciel.tiers/api/referentiel/villes?q=gren : doit renvoyer la liste des villes qui contiennent gren, les 4 lettres tapĂ©es par l'usager pour sa recherche. Les Ă©lĂ©ments de la liste doivent ĂȘtre renvoyĂ©s selon l'ordre le pertinence (les plus pertinents en premier).
  • GET https://logiciel.tiers/api/referentiel/villes?id=38000 : doit renvoyer une liste ne contenant qu'un seul Ă©lĂ©ment, Ă  savoir la ville ayant le code 38000

Comme pour une requĂȘte filtrĂ©e, la rĂ©ponse obĂ©it strictement au mĂȘme format que pour la liste complĂšte : un dictionnaire avec err Ă  0 (le nombre entier 0) et data qui contient la liste des Ă©lĂ©ments.

Format des réponses en cas d'erreur¶

Lorsque Publik envoie des données mal formatées¶

Si les donnĂ©es envoyĂ©es par Publik ne sont pas dans un format attendu par le logiciel, celui-ci doit renvoyer une erreur avec le dĂ©tail des incohĂ©rences constatĂ©es. Le retour est toujours un dictionnaire JSON avec deux entrĂ©e "err" et "data", mais cette fois err doit ĂȘtre diffĂ©rent de 0. Attention, erreur frĂ©quente : si err contient la chaine de caractĂšre "0" alors ça sera considĂ©rĂ© comme un code d'erreur. Il faut utiliser le nombre entier 0.

Le message technique peut ĂȘtre en anglais (par exemple un retour d'erreur SQL) mais il doit permettre Ă  un technicien de comprendre quel champ est en cause, et si possible le type d'erreur constatĂ© (valeur impossible, mauvais type de donnĂ©e, 
). Le message doit ĂȘtre contenu dans une clĂ© "err_desc" (description de l'erreur). Si c'est utile, un code type d'erreur peut ĂȘtre retournĂ© dans "err_class".

Le code de retour HTTP peut ĂȘtre 400, mais ce n'est pas obligatoire, le plus important est "err" diffĂ©rent de 0.

Par exemple si Publik envoie une demande avec une mauvaise information "foo" :

POST /api/creation-demande
{
  "foo": "trois" 
}

400 Bad Request
Content-Type: application/json

{
  "err": 1,
  "data": null,
  "err_desc": "valeur de foo non acceptĂ©e, doit ĂȘtre un entier",
  "err_class": "bad-request" 
}

Autres erreurs¶

Pour toutes les autres erreurs, par exemple si une Ă©criture SQL ne se fait pas, ou qu'un autre problĂšme technique survient lors de l'exĂ©cution du webservice par le logiciel, ce dernier doit tout de mĂȘme rĂ©pondre une rĂ©ponse JSON (afin que Publik sache qu'il a bien interrogĂ© le webservice mais que celui-ci a eu un problĂšme interne).

Typiquement, il ne fait jamais renvoyer une erreur de type 500 ou une "traceback".

Donc, mĂȘme en cas d'erreur :
  • Le code HTTP de retour doit toujours ĂȘtre 200 (c'est-Ă -dire « l'Ă©change avec le webservice a eu lieu et a voici sa rĂ©ponse ») modulo l'exception du code 400 indiquĂ©e plus haut en cas de mauvais format d'interrogation du webservice.
  • Le contenu du retour doit toujours ĂȘtre un dictionnaire JSON
  • La clĂ© "err" dans le JSON doit ĂȘtre diffĂ©rente de 0 ; trĂšs frĂ©quemment on indique juste le nombre 1
  • La clĂ© "data" peut ĂȘtre vide ou inexistante ; on Ă©vitera d’y mettre une valeur pour ne pas engendrer de confusion
Pour aider à la compréhension de l'erreur, on peut ajouter :
  • une clĂ© "err_desc" qui dĂ©crira l'erreur, si possible en français. Elle est destinĂ©e Ă  ĂȘtre affichĂ©e Ă  un administrateur fonctionnel ou un technicien de Publik qui pourra comprendre le soucis
  • une clĂ© "err_class" contenant un identifiant de l'erreur, qui peut ĂȘtre par exemple utilisĂ© pour que Publik gĂšre automatiquement une nouvelle tentative si l'erreur est conjoncturelle (non fatale).

Par exemple en cas d'impossibilité de joindre le SGBD :

GET /api/status-demande?id=42

200 OK
Content-Type: application/json

{
  "err": 1,
  "data": null,
  "err_desc": "table form_evolutions inaccessible",
  "err_class": "sql-error" 
}

Sécurisation de la communication entre Publik et les webservices du logiciel¶

Tous les Ă©changes auront lieux en HTTPS avec un certificat valide. Au cas oĂč le certificat est Ă©mis par une autoritĂ© de certification locale, il faut fournir le certificat de l'autoritĂ© (clĂ© publique).

L'accĂšs peut ĂȘtre reservĂ© aux adresses IP d'hĂ©bergement de l'instance Publik qui effecture les requĂȘtes.

Enfin, une authentification de type HTTP Basic peut ĂȘtre ajoutĂ©e en sĂ©curitĂ© supplĂ©mentaire.

Vous n'avez pas trouvĂ© ce que vous cherchez ?

Une suggestion ? Écrivez-nous !

Proposez une amélioration pour la documentation

DerniĂšre mise Ă  jour le 04/08/2026 10:11