Développeur de signes OneSpan : Intégrer avec Oracle PL/SQL - Partie 2

Duo Liang, septembre 4, 2019

Dans la première partie de cette série de blogs, nous avons démontré comment nous connecter au serveur OneSpan Sign via Oracle PL/SQL et invoquer les appels API. Si vous êtes nouveau à oracle PL / SQL programmation ou rencontré des erreurs de connexion comme "http http demande a échoué", la partie 1 blog est une bonne référence à lire en premier.

Nous continuerons à nous intégrer à l'API de OneSpan Sign via Oracle PL/SQL et à montrer comment créer une transaction ainsi que comment télécharger des données binaires documentaires. Sans plus tarder, commençons.

Réglage de l'en-tête de demande

Ce guide décomposera la section de code nécessaire par section. Si vous préférez, vous pouvez trouver l'ensemble du script dans ce post forum.

Dans les deux premières lignes, les informations de connexion pour votre connexion OneSpan Sign sont définies en plus d'autres constantes et types d'objets nécessaires qui seront utilisés dans le code suivant. 

créer ou remplacer la procédure create_package2
Comme
  oss_api_url varchar constant2(256) : 'https://sandbox.esignlive.com/api';
  oss_api_key varchar constant2(256) : 'your_api_key';

  l_newline varchar2(50) : chr (13) chr(10);
  lco_boundary varchar2 constant(30) : 'gc0p4Jq0M2Yt08jU534c0p';
 
  l_http_request utl_http.req;
  l_request_body clob;
  l_request_body_length nombre;
 
  l_http_response utl_http.resp;
  l_response_header_name varchar2(256);
  l_response_header_value varchar2(1024);
  l_response_body varchar2(32767);
 
  l_offset numéro : 1;
  l_amount nombre : 2000;
  l_buffer varchar2(2000);

  v_blob blob;
  v_buffer premières(32767);
  v_file bfile : bfilename ('MYDIR', 'SampleDoc.pdf');
  v_length entier;
  v_offset numéro(15) : 1;
  v_amount numéro(15) : 32767;

Si vous utilisez l'environnement de production, utilisez l'URL "https://apps.esignlive.com/api". Assurez-vous de remplacer le texte du placeholder par votre API_KEY. Vous pouvez trouver cette valeur dans la page ACCOUNT lorsqu'elle est signée dans votre compte OneSpan Sign.

Pour d'autres variables, ceux qui commencent par "l_" seront utilisés pour construire la demande HTTP, et celles commençant par "v_" seront spécifiquement utilisées pour télécharger les données binaires du document. Cette convention de nommage peut aider à organiser le codage et s'assurer qu'il sera facile à suivre.

Maintenant, nous sommes prêts à construire la procédure. La section suivante illustre comment initialiser l'objet de demande et construire l'en-tête de demande.

Commencer
  l_http_request : utl_http,begin_request(
                      url oss_api_url '/paquets',
                      méthode 'POST',
                      http_version 'HTTP/1.1'
                    );
  utl_http.set_wallet ('fichier:C: 'wallet5', NULL);
  utl_http.set_header (l_http_request, 'Authorization', 'Basic' ' ' ' oss_api_key ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 
  utl_http.set_header(l_http_request, 'Content-Type', 'multipart/form-data; boundary'' ' ' lco_boundary ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '"');
  utl_http.set_header (l_http_request, 'Transfer-Encoding', 'chunked');

Note:

- N'oubliez pas de définir un portefeuille pour votre connexion HTTPS
- Vous devez définir explicitement "Transfer-Encoding" à "chunked". (Référez-vous à cette documentation officielle pour la raison)

Out Stream Document binaire 

Avant de continuer à coder, nous allons avoir un examen rapide de la construction d'un organisme de demande:9-4-1

L'image ci-dessus vous donne une idée de ce qu'est un "multipart / form-data" corps de demande HTTP devrait ressembler, comment vous pouvez nommer votre contenu-disposition de sorte qu'il sera reconnu par le système OneSpan Sign, où vous devez ajouter une nouvelle ligne, et comment utiliser la limite pour séparer les différentes parties. 

Pour une description plus complète de ces détails, consultez notre blog "Upload Multiple Documents with REST".

La fonction clé que nous avons exploitée pour produire l'organisme de demande est "utl_http.write_raw(REQ r, RAW data)". Cela nous permet de passer dans l'objet de demande et une donnée de type brut. En combinant avec la fonction "utl_raw.cast_to_raw(l_buffer)" », nous pouvons convertir le varchar/corde en brut. 

  l_request_body : l_newline
|| '--' || lco_boundary l_newline
|| 'Content-Disposition: form-data; nom "fichier"; nom de fichier "file.pdf"' l_newline
|| 'Content-Type: application/pdf' l_newline
|| l_newline;

  l_request_body_length : dbms_lob.getlength (l_request_body);

  tandis que l_offset l_request_body_length loop>
    dbms_lob.lire (l_request_body, l_amount, l_offset, l_buffer);
    utl_http.write_raw (l_http_request, cast_to_raw utl_raw(l_buffer));
    l_offset : l_offset et l_amount;
  boucle d'extrémité;

Pour produire les données binaires du document, nous lisons d'abord le document à partir du chemin de fichier et chargé comme un objet BLOB. Nous allons ensuite boucle à travers la longueur du fichier pour lire un certain décalage de blob au type RAW et d'envoyer la demande HTTP dans un morceau à chaque fois.

  dbms_lob.createtemporary (v_blob, vrai, dbms_lob.call);
  dbms_lob.open (v_file, dbms_lob.lob_readonly);
  dbms_lob.open (v_blob, dbms_lob.lob_readwrite);
  v_length : dbms_lob.getlength (v_file);
  dbms_lob.loadfromfile (v_blob, v_file, v_length);

  tandis que v_offset v_length loop>
      dbms_lob.lire (v_blob, v_amount, v_offset, v_buffer);
      utl_http.write_raw (l_http_request, v_buffer);
      v_offset : v_offset et v_amount;
  boucle d'extrémité;

N'oubliez pas de fermer le ruisseau à la fin.

  dbms_lob.fermer (v_file);
  dbms_lob.close (v_blob);

Charge utile de demande de construction

Ensuite, nous enverrons la partie "charge utile" de la même manière. Reportez-vous à l'image du corps de demande ci-dessus pour vous assurer qu'il n'y a pas de petites erreurs au milieu du code. L'impression de votre corps de demande est un bon moyen d'auto-inspecter si le code fonctionne.

l_request_body : 
 l_newline
 || l_newline
|| '--' || lco_boundary l_newline
|| 'Content-Disposition: form-data; nom de "charge utile" l_newline
|| l_newline
|| '"nom":"transaction créée à partir d'Oracle","documents":["nom":"document1"]. l_newline
|| '--' || lco_boundary '--';
 
  l_request_body_length : dbms_lob.getlength (l_request_body);
  l_offset : 1;

  tandis que l_offset l_request_body_length loop>
    dbms_lob.lire (l_request_body, l_amount, l_offset, l_buffer);
    utl_http.write_raw (l_http_request, cast_to_raw utl_raw(l_buffer));
    l_offset : l_offset et l_amount;
  boucle d'extrémité;

Presque fini! Le seul travail restant est d'imprimer les paramètres de réponse et de gérer les exceptions. Cela sera couvert dans le prochain blog. 

Exécuter le code

Exécutez la procédure et l'état de réponse sera imprimé dans la console.

SET SERVEROUTPUT ON
EXEC create_package2();

Si vous avez fait l'appel API avec succès, vous verrez l'état "200" avec l'ID de paquet dans l'organisme de réponse:9-4-2

Si ce n'est pas le cas, peu importe, le message d'erreur sera également affiché. 9-4-3

Si vous avez des questions concernant ce blog ou toute autre chose concernant l'intégration de OneSpan Sign dans votre application, visitez les Forums communautairesdes développeurs . Vos commentaires sont importants pour nous!

OneSpan Sign Developer Community

OneSpan Sign Developer Community

Rejoignez la communauté OneSpan Sign Developer! Forums, blogs, documentation, téléchargements SDK, et plus encore.

Joignez-vous aujourd'hui