Esup-Signature

Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

  • smb, cmis, file, sftp / ftp, pour ces types, il faut suive les explications du tableau ci-dessus
  • http:// https:// (fera une requete, type REST, vers l'url avec en paramètre l'ID de la demande de signature, son statut signé ou refusé et le numéro d'étape concerné
  • mailto (envoi du document en pièce jointe au destinataire)

Voici un exemple de code à mettre coté application métier pour permettre à esup-signature de transmettre les informations du circuit via REST. Ici il s'agir d'un controleur Spring. La requête est envoyée en GET, esup-signature doit avoir un accès direct à cette API. 

Transmission vers REST

(maj depuis pour la version 1.30.x)

Lorsque vous configurez une adresse type "rest", donc vers un websevice en écoute, esup-signature va tenté de transmettre les données via GET et via POST.

Voici la liste (et le format) des données transmisent :

Bloc de code
languagejs
themeRDark
{
    "signRequestId": ["XXXX"],
    "status": ["deleted"],
    "step": [
        "2"
    ],
    "userEppn": [
        "esupdem@univ-rouen.fr"
    ],
    "comment": [
        ""
    ]
}


En GET les informations sont transmisent via les paramètres de la requête.

Voici un exemple de code à mettre coté application métier pour permettre à esup-signature de transmettre les informations du circuit via REST. Ici il s'agir d'un controleur Spring. La requête est envoyée en GET, esup-signature doit avoir un accès direct à cette API. 

Bloc de code
languagejava
themeRDark
    @GetMapping(value = "/return-test")
    @ResponseBody
    public ResponseEntity<Void> returnTest(@RequestParam("signRequestId") String signRequestId, @RequestParam("status") String status, @RequestParam("step") String step) {
        logger.info(signRequestId + ", " + status + ", " + step);
        //ici, le code à executer coté application métier en fonction du statut
        return ResponseEntity.ok().build();
    }


En POST, les informations sont transmisent sous forme de map json:

Voici un script python permettant de simuler un mini server web et affichant les données reçues:

Bloc de code
languagepy
themeRDark
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
import json

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    
    def do_GET(self):
        # Parse l'URL et ses paramètres
        parsed_path = urlparse(self.path)
        query_components = parse_qs(parsed_path.query)
        
        # Affiche les informations dans la console
        print("Received GET request:")
        print(f"Path: {self.path}")
        print("Query parameters:")
        for key, values in query_components.items():
            for value in values:
                print(f"  {key}: {value}")
        
        # Prépare la réponse (simple pour le client)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b"<html><body><h1>GET request received</h1></body></html>")

    def do_POST(self):
        # Récupère la longueur des données envoyées
        content_length = int(self.headers['Content-Length'])
        # Récupère le corps de la requête
        post_data = self.rfile.read(content_length)
        
        # Tente de décoder les données comme JSON
        try:
            json_data = json.loads(post_data)
            print("Received POST request with JSON data:")
            print(json.dumps(json_data, indent=4))
        except json.JSONDecodeError:
            print("Received POST request with invalid JSON")
            json_data = {"error": "Invalid JSON"}
        
        # Prépare la réponse (simple pour le client)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
Bloc de code
languagejava
themeRDark
    @GetMapping(value = "/return-test")
    @ResponseBody
    public ResponseEntity<Void> returnTest(@RequestParam("signRequestId") String signRequestId, @RequestParam("status") String status, @RequestParam("step") String step) {
        loggerself.wfile.infowrite(signRequestIdb"<html><body><h1>POST + ", " + status + ", " + step);request received</h1></body></html>")

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000):
    server_address    //ici, le code à executer coté application métier en fonction du statut
        return ResponseEntity.ok().build();
    }= ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting server on port {port}...")
    httpd.serve_forever()

if __name__ == '__main__':
    run()


...

Définir les participants à un circuit à posteriori

...