Вызов 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, получит быстрое решение.