Вызов api из хранимой процедуры sql-сервера

Вызов API из веб-формы asp.net очень прост.

С# Asp.Net

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

Но можно ли вызывать API из хранимой процедуры сервера Sql.

Если да, то как мы можем вызывать API из хранимой процедуры сервера Sql и как мы можем получить ответ API.

Ответ 1

Подробнее см. ссылку.

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

Ответ 2

Я так много работал, надеюсь, мои усилия помогут вам.

Просто вставьте это в вашу SSMS и нажмите 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

Этот запрос даст вам 3 результата:

1. Поймайте ошибку, если что-то пойдет не так (не паникуйте, она всегда будет отображать ошибку свыше 4000 символов, потому что NVARCHAR (MAX) может хранить только до 4000 символов)

2. Поместите JSON в строку (что мы и хотим)

3. БОНУС: проанализируйте JSON и аккуратно сохраните данные в таблицу (насколько это круто?)

enter image description here

Ответ 3

Я думаю, что было бы проще использовать этот процесс CLR Stored:

 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;

Ответ 4

Я бы порекомендовал использовать пользовательскую функцию CLR, если вы уже знаете, как программировать на С#, тогда код будет таким:

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);
 }
}

А вот инструкция по установке; https://blog.dotnetframework.org/2019/09/17/make-a-http-request-from-sqlserver-using-a-clr-udf/

Ответ 5

Простой запуск SQL-запроса API без создания проекта кода

Я знаю, что это далеко не идеальная или архитектурная чистота, но у меня был клиент с кратковременной критической необходимостью интегрироваться с сторонним продуктом через незрелый API (без wsdl) В основном мне нужно было вызвать API при возникновении события базы данных. Мне была предоставлена ​​базовая информация о вызовах - URL, метод, элементы данных и токен, но wsdl или другое не начали импортировать в проект кода. Все рекомендации и решения, похоже, начинаются с этого импорта.

Я использовал расширение расширения ARC (Advanced Rest Client) и JaSON для проверки взаимодействия с Сервисом из браузера и уточнения вызова. Это дало мне проверенную, необработанную структуру вызова и ответ и позволил мне быстро играть с API. Оттуда я начал пытаться генерировать wsdl или xsd из json, используя онлайн-конверсии, но решил, что это займет слишком много времени, чтобы работать, поэтому я нашел cURL (облачная часть, музыка играет). cURL разрешил мне отправлять вызовы API локальному менеджеру из любого места. Затем я нарушил еще несколько правил проектирования и построил триггер, который поставил в очередь события БД и хранимую процедуру SQL и запланированную задачу, чтобы передать параметры cURL и выполнить вызовы. Первоначально у меня был триггер, вызывающий XP_CMDShell (я знаю, booo), но мне не нравились транзакционные последствия или проблемы с безопасностью, поэтому переключился на метод хранимой процедуры.

В конце концов, вставка БД, соответствующая триггерам случая вызова API, записывает в таблицу Queue с параметрами вызова API Сохраненная процедура запускается каждые 5 секунд. Курсор вытягивает каждую запись в таблице Queue, отправляет вызов XP_CMDShell в файл bat с параметрами Файл Bat содержит вызов Curl с параметрами, вставленными отправкой вывода в журналы. Хорошо работает.

Опять же, не идеальный, но в сжатые сроки и система, используемая в краткосрочной перспективе, и которая может тщательно контролироваться, чтобы реагировать на возможности подключения и непредвиденные проблемы, она работала.

Надеюсь, что кто-то, кто борется с ограниченной информацией об API, получит быстрое решение.