web-dev-qa-db-fra.com

appel d'une API à partir de la procédure stockée du serveur SQL

Appeler une API à partir du formulaire Web asp.net est très facile.

C # Asp.Net

WebClient wc = new WebClient();
string urlData = wc.DownloadString("http://xxx.xxx.xx.xx/sssss/getResponse.do?ID=testing");

Mais pouvons-nous appeler une API à partir de la procédure stockée du serveur SQL.

Si oui, comment pouvons-nous appeler une API à partir d'une procédure stockée de serveur SQL et comment obtenir une réponse d'API.

19
Ashish Rathore

Veuillez voir n lien pour plus de détails.

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);

Code Snippet
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get',
                 'http://www.webservicex.com/stockquote.asmx/GetQuote?symbol=MSFT', --Your Web Service Url (invoked)
                 'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

Select @ResponseText

Exec sp_OADestroy @Object
27
fastobject

J'ai tellement travaillé, j'espère que mes efforts pourraient vous aider.

Collez-le simplement dans votre SSMS et appuyez sur F5:

Declare @Object as Int;
DECLARE @hr  int
Declare @json as table(Json_Table nvarchar(max))

Exec @hr=sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'open', NULL, 'get',
                 'http://overpass-api.de/api/interpreter?data=[out:json];area[name=%22Auckland%22]-%3E.a;(node(area.a)[amenity=cinema];way(area.a)[amenity=cinema];rel(area.a)[amenity=cinema];);out;', --Your Web Service Url (invoked)
                 'false'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'send'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object
Exec @hr=sp_OAMethod @Object, 'responseText', @json OUTPUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

INSERT into @json (Json_Table) exec sp_OAGetProperty @Object, 'responseText'
-- select the JSON string
select * from @json
-- Parse the JSON string
SELECT * FROM OPENJSON((select * from @json), N'$.elements')
WITH (   
      [type] nvarchar(max) N'$.type'   ,
      [id]   nvarchar(max) N'$.id',
      [lat]   nvarchar(max) N'$.lat',
      [lon]   nvarchar(max) N'$.lon',
      [amenity]   nvarchar(max) N'$.tags.amenity',
      [name]   nvarchar(max) N'$.tags.name'     
)
EXEC sp_OADestroy @Object

Cette requête vous donnera 3 résultats:

1 . Attrapez l'erreur en cas de problème (ne paniquez pas, cela vous montrera toujours une erreur supérieure à 4000 caractères car NVARCHAR (MAX) ne peut stocker que jusqu'à 4000 caractères )

2 . Mettez le JSON dans une chaîne (c'est ce que nous voulons)

3 . BONUS: analyser le JSON et bien stocker les données dans une table (c'est cool ça?)

enter image description here

14

Je pense qu'il serait plus facile d'utiliser ce proc stocké CLR:

 exec [dbo].[APICaller_POST]
     @URL = 'http://localhost:5000/api/auth/login'
    ,@BodyJson = '{"Username":"gdiaz","Password":"password"}'

Jetez un œil à ce dépôt https://github.com/geral2/SQL-APIConsumer/blob/master/README.md ;

2
Geraldo Diaz

Je recommanderais d'utiliser une fonction définie par l'utilisateur CLR, si vous savez déjà programmer en C #, alors le code serait;

using System.Data.SqlTypes;
using System.Net;

public partial class UserDefinedFunctions
{
 [Microsoft.SqlServer.Server.SqlFunction]
 public static SqlString http(SqlString url)
 {
  var wc = new WebClient();
  var html = wc.DownloadString(url.Value);
  return new SqlString (html);
 }
}

Et voici les instructions d'installation; https://blog.dotnetframework.org/2019/09/17/make-a-http-request-from-sqlserver-using-a-clr-udf/

0
Fiach Reid

Appel d'API déclenché par SQL simple sans construire de projet de code

Je sais que c'est loin d'être parfait ou d'une pureté architecturale, mais j'avais un client avec un besoin critique à court terme d'intégrer un produit tiers via une API immature (pas de wsdl), j'avais essentiellement besoin d'appeler l'API lorsqu'un événement de base de données s'est produit . J'ai reçu des informations de base sur l'appel - URL, méthode, éléments de données et jeton, mais aucun wsdl ou autre ne commence à être importé dans un projet de code. Toutes les recommandations et solutions semblaient commencer par cette importation.

J'ai utilisé l'ARC (Advanced Rest Client) Chrome et JaSON pour tester l'interaction avec le service à partir d'un navigateur et affiner l'appel. Cela m'a donné la structure et la réponse d'appel testées et brutes et laissé je joue rapidement avec l'API. À partir de là, j'ai commencé à essayer de générer le wsdl ou le xsd à partir du json en utilisant des conversions en ligne, mais j'ai décidé que cela allait prendre trop de temps pour fonctionner, j'ai donc trouvé cURL (partie nuages, pièces musicales). cURL m'a permis d'envoyer les appels d'API à un gestionnaire local de n'importe où. J'ai ensuite enfreint quelques règles de conception supplémentaires et créé un déclencheur qui a mis en file d'attente les événements de base de données et une procédure stockée SQL et une tâche planifiée pour transmettre les paramètres à cURL et effectuer les appels. Au départ, j'avais le déclencheur appelant XP_CMDShell (je sais, booo) mais je n'aimais pas les implications transactionnelles ou les problèmes de sécurité, donc je suis passé à la méthode de la procédure stockée.

Au final, l'insertion DB correspondant au cas d'appel API déclenche l'écriture dans la table de file d'attente avec des paramètres pour l'appel d'API La procédure stockée s'exécute toutes les 5 secondes exécute le curseur pour extraire chaque entrée de la table de file d'attente, envoie l'appel XP_CMDShell au fichier bat avec des paramètres Le fichier bat contient Curl appel avec paramètres insérés envoi de la sortie aux journaux. Fonctionne bien.

Encore une fois, pas parfait, mais pour un calendrier serré, et un système utilisé à court terme, et qui peut être surveillé de près pour réagir à la connectivité et aux problèmes imprévus, cela a fonctionné.

J'espère que cela aidera une personne aux prises avec des informations API limitées à obtenir rapidement une solution.

0
Todd C