IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Forms Oracle Discussion :

UTL_HTTP avec HTTPS [12c]


Sujet :

Forms Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Développeur
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Ingénieur Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut UTL_HTTP avec HTTPS
    Bonjour,

    J'ai depuis quelque jours une difficulté à consommé un web service Rest avec le package plsql UTL_HTTP.
    Avec les requêtes HTTP ça marche très bien, mais une fois j'ai le HTTPS il y a une erreur qui survient toujours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORA-29273: échec de demande HTTP
    ORA-53203: violation de sécurité
    ORA-06512: à "SYS.UTL_HTTP", ligne 380
    ORA-06512: à "SYS.UTL_HTTP", ligne 1127
    ORA-06512: à ligne 18
    Quelqu'un aurait une idée s'il vous plait ?
    Merci !

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Pour https il faut utiliser un Wallet, et à partir de la 11g tu dois créer des ACL (Access Control List). As-tu bien fait toutes ces actions?

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Je complémente ce qu'a dit Vanagreg.
    En 12c Oracle a rajouté la notion de nom de serveur dans UTL_HTTP.Begin_request,paramètre https_host pour gérer les noms d'hôtes différent du certificat

    exemple d'un de mes codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- On ouvre la demande
      $IF DBMS_DB_VERSION.VER_LE_11 
      $THEN
        req := UTL_HTTP.begin_request(url => p_url, METHOD => p_action, http_version => 'HTTP/1.1')
      $ELSE
        req := UTL_HTTP.begin_request(url => p_url, METHOD => p_action, http_version => 'HTTP/1.1', https_host => p_nomserveur)
      $END;
    Et en 12.2 le patch 181016 (16/10/2018) permet de gérer les serveur avec SNI
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Développeur
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Ingénieur Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Pour https il faut utiliser un Wallet, et à partir de la 11g tu dois créer des ACL (Access Control List). As-tu bien fait toutes ces actions?
    Bonjour, Effectivement j'ai déjà effectué ces actions. Pour le wallet j'ai vu un tutoriel qui parlait de ça et j'ai appliqué mais je pense pas que ça marche.
    Peut être que je l'ai mal exécuté je ne sais pas. En tout j'ai effectué toute les étapes dans le tuto.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Développeur
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Ingénieur Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par McM Voir le message
    Bonjour,

    Je complémente ce qu'a dit Vanagreg.
    En 12c Oracle a rajouté la notion de nom de serveur dans UTL_HTTP.Begin_request,paramètre https_host pour gérer les noms d'hôtes différent du certificat

    exemple d'un de mes codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- On ouvre la demande
      $IF DBMS_DB_VERSION.VER_LE_11 
      $THEN
        req := UTL_HTTP.begin_request(url => p_url, METHOD => p_action, http_version => 'HTTP/1.1')
      $ELSE
        req := UTL_HTTP.begin_request(url => p_url, METHOD => p_action, http_version => 'HTTP/1.1', https_host => p_nomserveur)
      $END;
    Et en 12.2 le patch 181016 (16/10/2018) permet de gérer les serveur avec SNI
    Merci pour le réponse. Je vais voir ça et vous reviens. Merci

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Vérifie bien tes exceptions et voit si l'erreur visible ne cache pas un autre problème.
    J'ai recherché l'erreur ORA-53203, et parfois c'est juste du close_connexion sur une connexion déjà fermée.

    Ensuite vérifie à quel niveau ça plante.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Développeur
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Ingénieur Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    J'ai effectué vos recommandations, mais j'arrive toujours pas à consommer le web service.
    Voici un exemple de code que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    DECLARE
     
        request UTL_HTTP.REQ;
        response UTL_HTTP.RESP;
        buff VARCHAR2(4000);
        clob_buff CLOB;
        url varchar(500):='https://restcountries.eu/rest/v2/all'; 
     
    BEGIN
     
        UTL_HTTP.SET_RESPONSE_ERROR_CHECK(true);
     
        UTL_HTTP.SET_WALLET('file:C:\oracle\certifs', 'pays12345'); 
     
        request := UTL_HTTP.begin_request(url => url, METHOD => 'GET', https_host => 'restcountries.eu'); 
     
        response := UTL_HTTP.GET_RESPONSE(request);
     
        DBMS_OUTPUT.PUT_LINE('HTTP response status code: ' || response.status_code);
     
        IF response.status_code = 200 THEN        
     
            BEGIN
                clob_buff := EMPTY_CLOB;
                LOOP
                    UTL_HTTP.READ_TEXT(response, buff, LENGTH(buff));
            clob_buff := clob_buff || buff;
                END LOOP;
            UTL_HTTP.END_RESPONSE(response);
        EXCEPTION
            WHEN UTL_HTTP.END_OF_BODY THEN
                    UTL_HTTP.END_RESPONSE(response);
            WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
                    UTL_HTTP.END_RESPONSE(response);
            END;
     
            DBMS_OUTPUT.PUT_LINE('RESULT : '||clob_buff);
     
        ELSE
            DBMS_OUTPUT.PUT_LINE('ERROR');
            UTL_HTTP.END_RESPONSE(response);
        END IF;
     
    END;
    /
    Et ça renvoie toujours cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORA-29273: échec de demande HTTP
    ORA-29259: fin d'entrée atteinte
    ORA-06512: à "SYS.UTL_HTTP", ligne 380
    ORA-06512: à "SYS.UTL_HTTP", ligne 1127
    ORA-06512: à ligne 17
    Merci de votre aide.

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En fait il n'y a pas de soucis, à part le code en plsql sur le dbms_output.put_line du clob

    Voici mon test (après avoir récupéré les certificats et créé un wallet)
    Pour afficher un clob, faut découper en x caractères, et le length(buff) dans le READ_TEXT est incorrect
    Pas besoin de CONTENT non plus pour tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    DECLARE  
      lo_req    UTL_HTTP.req;  
      lo_resp   UTL_HTTP.resp;  
      buff VARCHAR2(4000);
        clob_buff CLOB;
    BEGIN  
        UTL_HTTP.set_detailed_excp_support ( TRUE );  
        UTL_HTTP.set_wallet ( 'file:/home/Wallet_country', 'mon#password');  
    	   lo_req := UTL_HTTP.begin_request (url => 'https://restcountries.eu/rest/v2/all');  
        lo_resp := UTL_HTTP.get_response ( lo_req );  
        dbms_output.put_line ( lo_resp.status_code );  
        dbms_output.put_line ( lo_resp.reason_phrase );  
        IF lo_resp.status_code = 200
        THEN        
            BEGIN
                clob_buff := EMPTY_CLOB;
                LOOP
                    UTL_HTTP.READ_TEXT(lo_resp, buff, 4000);
                   -- DBMS_OUTPUT.put_line(buff);
            				clob_buff := clob_buff || buff;
                END LOOP;
            UTL_HTTP.END_RESPONSE(lo_resp);
        EXCEPTION
            WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(lo_resp);
            WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
                    UTL_HTTP.END_RESPONSE(lo_resp);
            END;
     
         FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(clob_buff)/4000)  
        LOOP
          	dbms_output.put_line(DBMS_LOB.SUBSTR(clob_buff, 4000, (i-1) * 4000 + 1));
        END LOOP;
    		--   DBMS_OUTPUT.PUT_LINE('RESULT : '||clob_buff);  -- Plantera si clob trop gros
     
        ELSE
            DBMS_OUTPUT.PUT_LINE('ERROR');
            UTL_HTTP.END_RESPONSE(lo_resp);
        END IF;
    EXCEPTION WHEN OTHERS THEN UTL_HTTP.end_response ( lo_resp );  RAISE;  
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Développeur
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Ingénieur Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    J'ai essayé ce code mais j'ai toujours la même erreur.
    Je sais pas vraiment qu'est-ce qui cloche.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Développeur
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Ingénieur Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par McM Voir le message
    En fait il n'y a pas de soucis, à part le code en plsql sur le dbms_output.put_line du clob

    Voici mon test (après avoir récupéré les certificats et créé un wallet)
    Pour afficher un clob, faut découper en x caractères, et le length(buff) dans le READ_TEXT est incorrect
    Pas besoin de CONTENT non plus pour tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    DECLARE  
      lo_req    UTL_HTTP.req;  
      lo_resp   UTL_HTTP.resp;  
      buff VARCHAR2(4000);
        clob_buff CLOB;
    BEGIN  
        UTL_HTTP.set_detailed_excp_support ( TRUE );  
        UTL_HTTP.set_wallet ( 'file:/home/Wallet_country', 'mon#password');  
    	   lo_req := UTL_HTTP.begin_request (url => 'https://restcountries.eu/rest/v2/all');  
        lo_resp := UTL_HTTP.get_response ( lo_req );  
        dbms_output.put_line ( lo_resp.status_code );  
        dbms_output.put_line ( lo_resp.reason_phrase );  
        IF lo_resp.status_code = 200
        THEN        
            BEGIN
                clob_buff := EMPTY_CLOB;
                LOOP
                    UTL_HTTP.READ_TEXT(lo_resp, buff, 4000);
                   -- DBMS_OUTPUT.put_line(buff);
            				clob_buff := clob_buff || buff;
                END LOOP;
            UTL_HTTP.END_RESPONSE(lo_resp);
        EXCEPTION
            WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(lo_resp);
            WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
                    UTL_HTTP.END_RESPONSE(lo_resp);
            END;
     
         FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(clob_buff)/4000)  
        LOOP
          	dbms_output.put_line(DBMS_LOB.SUBSTR(clob_buff, 4000, (i-1) * 4000 + 1));
        END LOOP;
    		--   DBMS_OUTPUT.PUT_LINE('RESULT : '||clob_buff);  -- Plantera si clob trop gros
     
        ELSE
            DBMS_OUTPUT.PUT_LINE('ERROR');
            UTL_HTTP.END_RESPONSE(lo_resp);
        END IF;
    EXCEPTION WHEN OTHERS THEN UTL_HTTP.end_response ( lo_resp );  RAISE;  
    END;
    J'ai essayé votre démarche mais ça m'affiche la même erreur.
    Je ne sais réellement ce qui cloche.

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Essaye d'enlever tout code superflu, juste récupérer le code retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE  
      lo_req    UTL_HTTP.req;  
      lo_resp   UTL_HTTP.resp;  
    BEGIN  
        UTL_HTTP.set_wallet ( 'file:/home/Wallet_country', 'mon#password');  
       lo_req := UTL_HTTP.begin_request (url => 'https://restcountries.eu/rest/v2/all');  
        lo_resp := UTL_HTTP.get_response ( lo_req );  
        dbms_output.put_line ( lo_resp.status_code );  
        dbms_output.put_line ( lo_resp.reason_phrase );  
    END;
    Si ça passe sans erreur et que le code retoue est 200, c'est la récupération des données dans le CLOB ou la gestion de fermeture de connexion
    Exécute ensuite le code sans raiser les erreurs, et vois le retour dbms
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    DECLARE  
      lo_req    UTL_HTTP.req;  
      lo_resp   UTL_HTTP.resp;  
      buff VARCHAR2(2000);
    BEGIN  
        UTL_HTTP.set_detailed_excp_support ( TRUE );  
        UTL_HTTP.set_wallet ( 'file:/home/Wallet_country', 'mon#password');  
    	   lo_req := UTL_HTTP.begin_request (url => 'https://restcountries.eu/rest/v2/all');  
        lo_resp := UTL_HTTP.get_response ( lo_req );  
        dbms_output.put_line ( lo_resp.status_code );  
        dbms_output.put_line ( lo_resp.reason_phrase );  
        BEGIN
                LOOP
                    UTL_HTTP.READ_TEXT(lo_resp, buff, 2000);
                     DBMS_OUTPUT.put_line(buff);
                END LOOP;
        EXCEPTION
         WHEN OTHERS THEN NULL;
            END;
        BEGIN UTL_HTTP.END_RESPONSE(lo_resp); EXCEPTION WHEN OTHERS THEN NULL;
      END;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. socket avec http
    Par djo0012 dans le forum C++
    Réponses: 10
    Dernier message: 16/07/2006, 01h27
  2. [Mail] Mail avec HTTP
    Par sezar dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2006, 22h09
  3. [HTML] Pb avec http-equiv="refresh"
    Par Sherkhan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 23/01/2006, 09h20
  4. Publication d'un site web avec HTTP ou FTP ?
    Par Mohammed200 dans le forum Autres langages pour le Web
    Réponses: 1
    Dernier message: 07/12/2005, 16h12
  5. [MS-DOS] Lancement de MozillaFirebird avec http://localhost/
    Par Furius dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/11/2005, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo