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

Développement SQL Server Discussion :

Appel Web Service - Récupération d'objet JSON


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 10
    Points : 12
    Points
    12
    Par défaut Appel Web Service - Récupération d'objet JSON
    Bonjour,

    Je suis confronté à une barrière technique en T-SQL sous SQL Server 2008 que je n'arrive pas à surmonter.
    Le problème est le suivant :

    J'ai un script SQL (pas encore transformé en procédure stockée) qui a pour rôle d'appeler un web service et de récupérer un objet JSON.

    Le script fonctionne bien jusqu'à l'envoi et la réception du status de la requête HTTP, par contre le problème qu'il se pose c'est au niveau de la récupération du responseText. La réponse étant du JSON, je ne sais pas dans qu'elle type de variable la stocker, si il faut la convertir avant de la récupérer,et... et j'obtiens une erreur lorsque je tente de la récupérer dans une variable de type nvarchar(max)
    Erreur : 0xC00CE56E
    Source : msxml3.dll
    Description : Erreur système*: -1072896658.

    Ma question est donc de savoir si il est possible de récupérer du JSON en SQL et si oui de quel manière.
    Merci pour votre aide.

    Ci-dessous le script en question :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
     
    DECLARE @URI varchar(2000) = 'http://.../...php'      
    DECLARE @methodName varchar(50) = 'POST'
    DECLARE @requestBody varchar(8000) =  'type=6&module=2&id=101&title=Titre  Notif&message=Message Notif&externalRef=8'
    DECLARE @UserName nvarchar(100) = 'UserName '
    DECLARE @Password nvarchar(100) = 'Password '
    DECLARE @responseText nvarchar(max) = ''
     
    SET NOCOUNT ON
     
    SET @responseText = 'FAILED'
    DECLARE @objectID int
    DECLARE @hResult int
    DECLARE @source varchar(255), @desc varchar(255) 
     
    EXEC @hResult = sp_OACreate 'MSXML2.ServerXMLHTTP', @objectID OUT
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT    hResult = convert(varbinary(4), @hResult), 
                    source = @source, 
                    description = @desc, 
                    FailPoint = 'Create failed', 
                    MedthodName = @methodName 
          goto destroy 
          return
    END
     
    -- open the destination URI with Specified method 
    EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false'
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT    hResult = convert(varbinary(4), @hResult), 
                    source = @source, 
                    description = @desc, 
                    FailPoint = 'Open failed', 
                    MedthodName = @methodName 
          goto destroy 
          return
    END
     
    -- set request headers - Content-Type
    EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Type', 'application/x-www-form-urlencoded'
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT    hResult = convert(varbinary(4), @hResult), 
                    source = @source, 
                    description = @desc, 
                    FailPoint = 'SetRequestHeader failed', 
                    MedthodName = @methodName 
          goto destroy 
          return
    END
    -- set request headers - Authorization
    DECLARE @CrendentialEncoded VARCHAR(500) = @UserName + ':' + @Password
     
    SELECT @CrendentialEncoded = CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'VARCHAR(MAX)')
    FROM ( SELECT CAST(@CrendentialEncoded AS VARBINARY(MAX)) AS bin) AS bin_sql_server_temp;
     
    SET @CrendentialEncoded = 'Basic ' + @CrendentialEncoded
    PRINT @CrendentialEncoded
    EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Authorization', @CrendentialEncoded
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT    hResult = convert(varbinary(4), @hResult), 
                    source = @source, 
                    description = @desc, 
                    FailPoint = 'SetRequestHeader failed', 
                    MedthodName = @methodName 
          goto destroy 
          return
    END
    DECLARE @returnval nvarchar(max)
    -- send the request 
    EXEC @hResult = sp_OAMethod @objectID, 'send', null, @requestBody 
    IF    @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT    hResult = convert(varbinary(4), @hResult), 
                    source = @source, 
                    description = @desc, 
                    FailPoint = 'Send failed', 
                    MedthodName = @methodName 
          goto destroy 
          return
    END
     
    -- Get status text 
    declare @statusText varchar(1000), @status varchar(1000) 
    exec sp_OAGetProperty @objectID, 'StatusText', @statusText out
    exec sp_OAGetProperty @objectID, 'Status', @status out
    select @status as Status, @statusText as StatusText, @methodName as MethodName
     
     
    -- Get response text 
    EXEC @hResult = sp_OAGetProperty @objectID, 'responseText',@responseText OUTPUT
    --Exec @hResult = sp_OAMethod @objectID, 'responseText', @responseText OUTPUT
     
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT    hResult = convert(varbinary(4), @hResult), 
                    source = @source, 
                    description = @desc, 
                    FailPoint = 'ResponseText failed', 
                    MedthodName = @methodName 
          goto destroy 
          return
    END
    Select @ResponseText [ResponseText]
     
    destroy: 
          exec sp_OADestroy @objectID 
    SET NOCOUNT OFF
     
    GO

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    le JSON est une forme dérivée du XML. SQL Server permettant de retournée du XML an lieu et place du dataset, il suffit de savoir faire la transformation....
    Exemple : http://www.codeproject.com/Articles/...L-Data-to-JSON

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Le lien que tu me donnes explique comment transformer du JSON en xml en javaScript.
    En fait, c'est pas trop ca que je souhaite faire.

    Ce que je veux, c'est récupérer mon objet JSON sous SQL Server, ensuite je n'aurais pas de problème pour le parser.

    Pour récupérer mon JSON sous sql server, je dois passer une variable en output dans l'appel de la procédure sp_OAMethod. Mais cette procédure foire, certainement car j'ai un type incompatible entre ma variable @responseText et ce que me retourne mon webservice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exec @hResult = sp_OAMethod @objectID, 'responseText', @responseText OUTPUT
    Je pense plutôt que la solution se trouve dans l'appel des méthodes d'accès au webservice (sp_OACreate,sp_OAGetProperty,sp_OAMethod), il doit bien exister un moyen pour faire comprendre au système de convertir l'objet JSON en nvarchar ou xml ou autre pour que je puisse le récupérer sans problème lors de l'appel de sp_OAMethod @objectID, 'responseText'

Discussions similaires

  1. [Prototype] Appel d'un web service qui retourne un JSON en javascript
    Par cocobelle89 dans le forum Bibliothèques & Frameworks
    Réponses: 13
    Dernier message: 30/05/2013, 18h50
  2. Appel d'un web service retournant un objet complexe
    Par yayasam dans le forum Services Web
    Réponses: 5
    Dernier message: 24/03/2011, 11h48
  3. Problème appel Web Service SharePoint
    Par bugmenot dans le forum Windows
    Réponses: 0
    Dernier message: 14/09/2007, 15h09
  4. Web Service : récupération objet request
    Par silver95 dans le forum Services Web
    Réponses: 1
    Dernier message: 26/08/2007, 19h29
  5. [2.0][C#] appel web service
    Par lenoil dans le forum Services Web
    Réponses: 1
    Dernier message: 09/10/2006, 08h24

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