SQL ServerストアドプロシージャからAPIを呼び出す




sql-server stored-procedures (4)

このCLR Stored procを使うほうが簡単だと思います。

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

https://github.com/geral2/SQL-APIConsumer/blob/master/README.md ;このリポジトリをhttps://github.com/geral2/SQL-APIConsumer/blob/master/README.md

asp.net WebフォームからAPIを呼び出すのはとても簡単です。

C#Asp.Net

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

しかし、SQL ServerのストアドプロシージャからAPIを呼び出すことはできますか。

もしそうなら、どのように我々はSqlサーバのストアドプロシージャからAPIを呼び出すことができ、そしてどのように我々はAPIレスポンスを得ることができます。


Answer #1

私はとても働きました、私の努力があなたを助けるかもしれないと思います:

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

このクエリはあなたに3つの結果を与えるでしょう:

1 。 何か問題が発生した場合のエラーをキャッチします(パニックにならないでください、 NVARCHAR(MAX)は4000文字までしか格納できないため、常に4000文字を超えるエラーが表示されます)。

2 。 JSONを文字列にします(これが私たちが望むものです)。

3 。 ボーナス:JSONを解析し、データをテーブルにうまく保存します(それはどれほどクールですか?)


Answer #2

詳しくはリンクをご覧ください。

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

Answer #3

コードプロジェクトを構築せずに簡単なSQLがAPI呼び出しをトリガ

これは完全またはアーキテクチャの純粋さからは程遠いことを私は知っていますが、私はデータベースイベントが発生したときにAPIを呼び出すために基本的にAPIを呼び出す必要がありました。 。 URL、メソッド、データ要素、トークンという基本的な呼び出し情報が与えられましたが、wsdlやその他のコードプロジェクトへのインポートは開始されませんでした。 すべての推奨事項と解決策は、そのインポートから始まったようです。

私はブラウザからサービスとの相互作用をテストし、電話を洗練するためにARC(Advanced Rest Client)Chrome拡張とJaSONを使用しました。 これで、テスト済みの生の呼び出し構造と応答が得られ、APIをすぐに使用できるようになりました。 そこから、私はオンライン変換を使用してJSONからwsdlまたはxsdを生成しようとし始めましたが、作業には時間がかかりすぎることになると決めたので、私はcURL(雲の部分、音楽再生)を見つけました。 cURLを使えば、どこからでもローカルマネージャにAPI呼び出しを送信することができました。 次に、さらにいくつかの設計規則を破り、DBイベントとSQLストアドプロシージャおよびスケジュールされたタスクをキューに入れてcURLにパラメータを渡して呼び出しを行うトリガを作成しました。 私は当初XP_CMDShellを呼び出すトリガーを持っていました(私は知っています、booo)が、トランザクションの影響やセキュリティの問題が好きではなかったので、ストアドプロシージャメソッドに切り替えました。

最後に、APIコールケースに一致するDB挿入は、APIコール用のパラメータを使用してキューテーブルに書き込みをトリガーします。5秒ごとにストアドプロシージャを実行してカーソルを実行し、各キューテーブルのエントリを取得し、XP_CMDShellコールをパラメータ付きでbatファイルに送信します。パラメータを挿入して呼び出し、ログに出力を送信します。 うまくいきます。

繰り返しになりますが、完璧ではありませんが、スケジュールが厳しく、システムが短期間使用されていたため、接続性や予期せぬ問題に対処するために綿密に監視することができました。

限られたAPI情報に苦しんでいる誰かがすぐに解決策を得るのを助けることを願っています。





stored-procedures