[SQL Server] Envoyer la commande GET, POST, PATCH, DELETE ou PUT vers un service Web de type REST - Deuxième méthode

-- =============================================

-- Author:          KHARROUBI Zouhaier

-- Create date:     24/05/2018

-- Description:     Interroger le service Web de type REST

/*Exemple d'utilisation de la procédure stockée

CREATE TABLE #JournalTemp

(

Num_Lig                                               INT                        NULL

,Type_Lig                                             CHAR(1)                    NULL

,[URL]                                                VARCHAR(MAX)               NULL

,Body                                                 VARCHAR(MAX)               NULL

,Requete                                              VARCHAR(MAX)               NULL

,Num_Erreur                                           BIGINT                     NULL

,Statut                                               INT                        NULL

,StatusText                                           VARCHAR(200)               NULL

,ResponseText                                         VARCHAR(MAX)               NULL

)

--Pour récupérer le résultat dans une table temporaire il faut passer par un lien serveur sinon un message d'erreur lié aux INSERT INTO imbriqués

INSERT INTO #JournalTemp

EXEC [LOCALHOST].MA_BASE.dbo.usp_InterrogerServiceWebRest 'https://mektaba.info/clients/auth/login/','{"userName":"MonLogin","password":"MonPassword"}','post',NULL,1;

SELECT * FROM #JournalTemp

*/

-- =============================================

Le code source

CREATE PROCEDURE [dbo].[usp_InterrogerServiceWebRest]

       -- Add the parameters for the stored procedure here

        @URL                            VARCHAR(8000)

       ,@body                           VARCHAR(800)

       ,@Commande                       VARCHAR(10)-- get ou post

       ,@Jeton                          VARCHAR(8000)=NULL

       ,@ResponseTextSup4000            BIT=0 --Cette variable indique si La réponse du service web dépasse 4000 carctètres ou pas

                                              --Lorsque la réponse depasse 4000 carctères il faut envoyer le résultat vers un table

                                              --Il est impossible d'envoyer le résulat vers une variable de type VARCHAR(MAX)

AS

BEGIN

       -- SET NOCOUNT ON added to prevent extra result sets from

       -- interfering with SELECT statements.

       SET NOCOUNT ON;

   -- Insert statements for procedure here

       IFEXISTS(SELECT * FROM tempdb..sysobjectsWHERE id =object_id(N'[tempdb]..[#ResultatFinal]'))

             BEGIN

                    DROP TABLE #ResultatFinal

             END

       IFEXISTS(SELECT * FROM tempdb..sysobjectsWHERE id =object_id(N'[tempdb]..[#ResponseTable]'))

             BEGIN

                    DROP TABLE #ResponseTable

             END

       CREATE TABLE #ResultatFinal

       (

       Num_Lig                                              INTIDENTITY(1,1)

       ,Type_Lig                                             CHAR(1)                    NULL

       ,[URL]                                                VARCHAR(MAX)               NULL

       ,Body                                                 VARCHAR(MAX)               NULL

       ,Requete                                              VARCHAR(MAX)               NULL

       ,Num_Erreur                                           BIGINT                     NULL

       ,Statut                                               INT                        NULL

       ,StatusText                                           VARCHAR(200)               NULL

       ,ResponseText                                         VARCHAR(MAX)               NULL

       )

       CREATE TABLE #ResponseTable

       (

       ResponseText VARCHAR(MAX)

       )

       DECLARE       @Resultat          AS INT

                    ,@JetonObjet        AS INT

                    ,@Taille            AS INT

                    ,@Statut            AS INT

                    ,@StatutText        AS VARCHAR(200)

                    ,@ResponseText      AS VARCHAR(8000)

                    ,@ResponseTextMax   AS VARCHAR(MAX)

                          

             SELECT @Taille =LEN(@body)

             EXEC @Resultat=sp_OACreate'WinHttp.WinHttpRequest.5.1', @JetonObjet OUT

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OACreate ''WinHttp.WinHttpRequest.5.1'', '+CAST(@JetonObjet AS VARCHAR(35))+' OUT', @Resultat)

             EXEC @Resultat=sp_OAMethod@JetonObjet,'open',NULL, @Commande,@URL,'false'

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''open'', NULL, '''+ @Commande +''','+ @URL+', ''false''', @Resultat)

             EXEC @Resultat=sp_OAMethod@JetonObjet,'setRequestHeader',null,'Content-Type','application/json'

             ----Exec sp_OAMethod @JetonObjet, 'setRequestHeader', null, 'Content-Type', 'application/json-patch+json'

             ----EXEC @Resultat = sp_OAMethod @Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''setRequestHeader'', null, ''Content-Type'', ''application/json''', @Resultat)

            

             EXEC @Resultat=sp_OAMethod@JetonObjet,'setRequestHeader',null,'Content-Length', @Taille

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''setRequestHeader'', null, ''Content-Length'','+CAST(@Taille AS VARCHAR(35)), @Resultat)

             IF @Jeton ISNOTNULL

                    BEGIN

                           EXEC @Resultat=sp_OAMethod@JetonObjet,'setRequestHeader',null,'Authorization', @Jeton

                           INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

                           VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''setRequestHeader'', null, ''Authorization'','+CAST(@Jeton AS VARCHAR(8000)), @Resultat)

                    END

             EXEC @Resultat=sp_OAMethod@JetonObjet,'setRequestBody',null,'Body', @Body

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''setRequestBody'', null, ''Body'', '+ @body, @Resultat)

             EXEC @Resultat=sp_OAMethod@JetonObjet,'send',null, @Body

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''send'', null, '+ @Body, @Resultat)

             EXEC @Resultat=sp_OAMethod@JetonObjet,'Status', @Statut OUTPUT

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''Status'', @Statut OUTPUT', @Resultat)

             EXEC @Resultat=sp_OAMethod@JetonObjet,'StatusText', @StatutText OUTPUT

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''StatusText'', @StatutText OUTPUT', @Resultat)

             IF @ResponseTextSup4000=0

                    BEGIN

                           EXEC @Resultat=sp_OAMethod@JetonObjet,'responseText', @ResponseText OUTPUT

                           INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

                           VALUES ('L',@URL,@Body,'sp_OAMethod @JetonObjet, ''responseText'', @ResponseText OUTPUT', @Resultat)

      

                           INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Statut,StatusText,ResponseText)  

                           VALUES ('D',@URL,@Body,@Statut,@StatutText,@ResponseText)

                          

                    END

             ELSE

                    BEGIN

                           INSERT INTO #ResponseTable

                           EXEC @Resultat =sp_OAGetProperty@JetonObjet,'responseText';

                           ----EXEC @Resultat = sp_OAGetProperty @JetonObjet, 'responseXML.xml'

                          

                           SELECT @ResponseTextMax = ResponseText FROM #ResponseTable

                          

                           INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

                           VALUES ('L',@URL,@Body,'sp_OAGetProperty @JetonObjet, ''responseText''', @Resultat)

                           INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Statut,StatusText,ResponseText)  

                           VALUES ('D',@URL,@Body,@Statut,@StatutText,@ResponseTextMax)

                    END

             EXEC @Resultat=sp_OADestroy@JetonObjet

             INSERT INTO #ResultatFinal(Type_Lig,URL,Body,Requete,Num_Erreur)  

             VALUES ('L',@URL,@Body,'sp_OADestroy '+CAST(@JetonObjet AS VARCHAR(35)), @Resultat)

             SELECT * FROM #ResultatFinal

      

            

                   

END