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

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

-- Author:        Zouhaier KHARROUBI

-- Create date:   26/04/2018

-- Description:   Envoyer la commande GET, POST, PATCH, DELETE ou PUT vers un service Web de type REST

-- NB : Lorsque le retour du WebService dépasse 800 carctères la fonction la fonction retourne un résultat vide. Pour contourner ce problème il faut interroger le WebService via un package SSIS ou une procédure stockée. Voir les liens ci-dessous.

https://www.mektaba.info/ssis/509-sql-server-envoyer-la-commande-get-vers-un-service-web-de-type-rest

https://www.mektaba.info/ssis/508-sql-server-envoyer-la-commande-post-vers-un-service-web-de-type-rest

https://www.mektaba.info/transact-sql/516-sql-server-envoyer-la-commande-get-post-patch-delete-ou-put-vers-un-service-web-de-type-rest-deuxieme-methode

--Exemple d'utilisation

SELECT Num_Lig,Type_Lig,[URL],Body,Requete,Num_Erreur,Statut,StatusText,ResponseText FROM [dbo].unf_InterrogerServiceWebRest('https://mektaba.info/api/v1/auth/login/','{"userName":"MonLogin","password":"MonMotDePasse"}','post',NULL)

ORDER BY Num_Lig

Code Source

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

CREATE FUNCTION [dbo].[unf_InterrogerServiceWebTraitementRest]

(    

      -- Add the parameters for the function here

      @URL             VARCHAR(8000)

      ,@body           VARCHAR(800)

      ,@Commande       VARCHAR(10) -- GET, POST, PATCH, DELETE ou PUT

      ,@Jeton          VARCHAR(8000)=NULL

)

RETURNS @ResultatFinal TABLE

(

Num_Lig                                       INT IDENTITY(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(8000)     NULL

)

AS

BEGIN

            DECLARE @Resultat           AS INT

                        ,@Objet                 AS INT

                        ,@Taille          AS INT

                        ,@Statut          AS INT

                        ,@StatutText      AS VARCHAR(200)

                        ,@ResponseText    AS VARCHAR(8000)

                       

            SELECT @Taille = LEN(@body)

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

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

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

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

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

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

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

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

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

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

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

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

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

            IF @Jeton IS NOT NULL

                  BEGIN

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

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

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

                  END

            Exec @Resultat=sp_OAMethod@Objet, 'setRequestBody', null, 'Body', @Body

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            EXEC @Resultat=sp_OADestroy@Objet

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

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

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

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

RETURN

END