[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
*/
-- =============================================
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