Cara Memanggil REST API dari SQL Server Menggunakan Store Procedure
Tags: sqlserver, restapi, sqlserverapi, sqlserverconsumeapi
Published: 2024-07-04 11:56:06

Halo teman-teman developer!

Saya sangat senang berbagi dengan Anda sebuah skrip prosedur tersimpan yang memungkinkan Anda memanggil REST API langsung dari SQL Server. Ini bisa sangat berguna dalam berbagai skenario, seperti mengintegrasikan data eksternal ke dalam aplikasi Anda, memvalidasi data terhadap layanan pihak ketiga, atau mengotomatiskan tugas yang memerlukan komunikasi dengan API eksternal.

**Apa yang akan Anda pelajari:**
- Cara mengatur dan menggunakan OLE Automation dalam SQL Server
- Membuat prosedur tersimpan yang memanggil REST API dan mengembalikan hasilnya
- Menangani respon JSON dari API dan mengolahnya di dalam SQL Server

**Kelebihan Utama:**
Salah satu kelebihan utama dari store procedure yang saya buat adalah kemampuannya untuk menggunakan nama kolom dan respon API yang dinamis. Dengan fitur ini, Anda hanya perlu memasukkan mapping antara nama respon API dan nama kolom tabel yang ingin dibentuk sebagai parameter. Ini membuat store procedure ini sangat fleksibel dan mudah digunakan dalam berbagai skenario.

**Kegunaan:**
- Integrasi data eksternal ke dalam basis data SQL Server Anda
- Validasi data secara real-time menggunakan layanan pihak ketiga
- Otomatisasi tugas yang memerlukan akses ke API eksternal

**Detail Skrip:**
Saya telah menyertakan skrip lengkap beserta penjelasan langkah demi langkah sehingga Anda dapat dengan mudah memahami dan mengimplementasikannya dalam proyek Anda sendiri. Anda akan menemukan bagaimana cara membuat dan mengkonfigurasi prosedur tersimpan yang memanggil REST API, serta contoh penggunaannya dalam berbagai kasus praktis.

_Eksekusi script ini di database Anda, setelah di eksekusi pastikan store procedure ini "SP_REQUEST_TO_API" (atau anda bisa menggatinya) sudah terbentuk di database pada bagian store procedure._

Berikut Script untuk Store Procedure nya :
```
/****** Object:  StoredProcedure [dbo].[SP_REQUEST_TO_API]    Script Date: 03/07/2024 00:29:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Amry Maftuh>
-- Create date: <Create Date,,2024-07-03>
-- Description:	<Description,,GET DATA FROM API>
-- =============================================
ALTER PROCEDURE [dbo].[SP_REQUEST_TO_API]
	@URL NVARCHAR(MAX), -- Alamat URL yang akan di-request
    @RESP_KEY NVARCHAR(MAX), -- Nama key berupa array dari response yang mau diambil
    @METHOD NVARCHAR(MAX), -- HTTP method: GET/POST/PUT/DELETE
    @Mapping NVARCHAR(MAX) -- Mapping key-value dalam format 'RESPONSE_KEY1:COLUMN_NAME1,RESPONSE_KEY2:COLUMN_NAME2,...'
AS

	-------- TEST INPUT
	--DECLARE @URL NVARCHAR(MAX), @RESP_KEY NVARCHAR(MAX), @METHOD NVARCHAR(MAX), @Mapping NVARCHAR(MAX)
	--SET @URL = 'https://api-sekolah-indonesia.vercel.app/sekolah?sort_dir=desc&page=1&perPage=100'
	--SET @URL = 'https://reqres.in/api/users?page=1'
	--SET @RESP_KEY = 'dataSekolah'
	--SET @METHOD = 'GET'
	--SET @Mapping = 'sekolah:NAMA_SEKOLAH,bentuk:JENJANG,alamat_jalan:ALAMAT,lintang:LAT,bujur:LNG'

	 ----	EXEC SP_REQUEST_TO_API 
	 ----   @URL = 'https://api-sekolah-indonesia.vercel.app/sekolah?sort_dir=desc&page=1&perPage=100',
	 ----   @RESP_KEY = 'dataSekolah',
	 ----   @METHOD = 'GET',
	 ----   @Mapping = 'sekolah:NAMA_SEKOLAH,bentuk:JENJANG,alamat_jalan:ALAMAT,lintang:LAT,bujur:LNG';
	--------


	SET NOCOUNT ON;

	EXEC sp_configure 'show advanced options', 1;
	RECONFIGURE;
	EXEC sp_configure 'Ole Automation Procedures', 1;
	RECONFIGURE;

	DECLARE @TOKEN INT;
	DECLARE @RET INT;
	DECLARE @JSON AS TABLE(JSON_TABLE NVARCHAR(MAX));
	DECLARE @MappingResponse TABLE (RESPONSE_KEY NVARCHAR(250), COLUMN_NAME NVARCHAR(250));

	DECLARE @MappingSplit TABLE (ITEM NVARCHAR(MAX));
	INSERT INTO @MappingSplit (ITEM)
	SELECT value FROM STRING_SPLIT(@Mapping, ',');

	INSERT INTO @MappingResponse (RESPONSE_KEY, COLUMN_NAME)
	SELECT 
		PARSENAME(REPLACE(ITEM, ':', '.'), 2) AS RESPONSE_KEY,
		PARSENAME(REPLACE(ITEM, ':', '.'), 1) AS COLUMN_NAME
	FROM @MappingSplit;

	EXEC @RET = sp_OACreate 'MSXML2.XMLHTTP', @TOKEN OUT;
	IF @RET <> 0 RAISERROR('Unable to open HTTP connection.', 10, 1);
	EXEC @RET = sp_OAMethod @TOKEN, 'open', NULL, @METHOD, @URL, 'false';
	EXEC @RET = sp_OAMethod @TOKEN, 'send';
	INSERT INTO @JSON (JSON_TABLE)
	EXEC sp_OAGetProperty @TOKEN, 'responseText';

	DECLARE @Columns NVARCHAR(MAX), @Columns_Keys NVARCHAR(MAX), @COLUMN_NAMES NVARCHAR(MAX), @RESPONSE_KEYS NVARCHAR(MAX);
	SELECT @Columns = STRING_AGG(CONCAT('[', COLUMN_NAME, '] NVARCHAR(2000)'), ', ') FROM @MappingResponse;
	SELECT @Columns_Keys = STRING_AGG(CONCAT('', COLUMN_NAME, ' NVARCHAR(2000) ''$.' + RESPONSE_KEY + ''''), ', ') FROM @MappingResponse;
	SELECT @COLUMN_NAMES = STRING_AGG(COLUMN_NAME, ', ') FROM @MappingResponse;
	SELECT @RESPONSE_KEYS = STRING_AGG(RESPONSE_KEY, ', ') FROM @MappingResponse;

	IF OBJECT_ID('tempdb..##TEMP_TABLE') IS NOT NULL
		DROP TABLE ##TEMP_TABLE;

	DECLARE @CreateTableQuery NVARCHAR(MAX);
	SET @CreateTableQuery = 'CREATE TABLE ##TEMP_TABLE (ROW_ID INT IDENTITY(1,1),' + @Columns + ');';
	EXEC sp_executesql @CreateTableQuery;

	DECLARE @InsertQuery NVARCHAR(MAX);
	DECLARE @JSON2 NVARCHAR(MAX);
	SET @JSON2 = (SELECT JSON_TABLE FROM @JSON);

	SET @InsertQuery = '
		INSERT INTO ##TEMP_TABLE (' + @COLUMN_NAMES + ')
		SELECT ' + @COLUMN_NAMES + '
		FROM OPENJSON(@JSON2, ''$.' + @RESP_KEY + ''') 
		WITH (' + @Columns_Keys + ');
	';

	EXEC sp_executesql @InsertQuery, N'@JSON2 NVARCHAR(MAX)', @JSON2 = @JSON2;
	SELECT * FROM ##TEMP_TABLE;

```

cara menggunakan nya seperti ini :

```
       EXEC SP_REQUEST_TO_API 
	    @URL = 'https://api-sekolah-indonesia.vercel.app/sekolah?sort_dir=desc&page=1&perPage=100',
	    @RESP_KEY = 'dataSekolah',
	    @METHOD = 'GET',
	    @Mapping = 'sekolah:NAMA_SEKOLAH,bentuk:JENJANG,alamat_jalan:ALAMAT,lintang:LAT,bujur:LNG';
```

Saya harap skrip ini bermanfaat bagi Anda dan membantu dalam mempermudah integrasi API eksternal dengan SQL Server Anda. Jangan ragu untuk meninggalkan komentar atau pertanyaan jika Anda memiliki kesulitan atau masukan.

Selamat coding!