Bu videomuzda Trendyol API lerinden veri çekmeyi göreceğiz.....
- Yazılım Uzmanları
- 16 Mart 2022
- 2259 kez görüntülendi.
Bu videomuzda Trendyol API lerinden veri çekmeyi göreceğiz. Öncelikle bu konuya girerken Trendyol daki supplierId, ApiKey, ApiSecretkey bilgilerinizi biliyor olmanız lazım.
API Key API Secret Key
Trendyoldaki mağazanızdan size ait bilgilere ulaşabilmeniz ve işlem yapabilmeniz için Satıcı Id nizi bilmeniz ve Trendyol API anahtarı almanız gerekmektedir. Bu bilgilerinize Trendyol hesabınızdan Hesabım bölümünün altındaki Entegrasyon Bilgileri sekmesinden ulaşabilirsiniz. Bu sekme altında Satıcı Id, API Key ve API Secret bilgileriniz bulunmaktadır. Bu bilgileri aldıktan sonra authorization bilgilerinizi oluşturabilmeniz için API Key ve API Secret bilgilerinizi base64 olarak kodlamanız gerekmektedir. Base64 çevrimi ile ilgili fonksiyon için videoumuzun altındaki linklerden faydalanabilrisiniz.
Authorization bilgilerinizi fnBase64Encode fonksiyonu yardımıyla aşağıdaki şekilde oluşturabilirsiniz
Declare @authorization nvarchar(max) Declare @apiKey nvarchar(max) = 'MağazaAPIKeyBilginiz’ Declare @apiSecret nvarchar(max) = 'MağazaAPISecretBilginiz’ select @authorization = ‘Basic ' + dbo.fnBase64Encode(@apiKey + ':' + @apiSecret) Select @authorization
Kategorileri ve Alt Kategorileri Çekme
Trendyol API lerinden Kategorileri ve alt kategorileri alabilmek için https://api.trendyol.com/sapigw-product/product-categories adresine istek göndereceğiz. Bu işlem için önceki videomuzlarımızda oluşturduğumuz sp_GetHttpRequest stored procedure unden faydalanacağız.
Aldığımız json formatındaki verilerin içerisinde Kategori ve alt kategori listesi iç içe nesne olarak geliyor. Üst Kategoriler kendisine bağlı alt kategorileri ve bu alt kategorilere bağlı alt kategoriler şeklinde en alt kategoriye kadar iç içe nesne (nested object) olarak tasarlanmış.
Bu json verilerine normal bir şekilde select çektiğimizde sadece en üst kategori bilgilerini alabiliriz. Biz bu işlem için bulunduğumuz yeri kaybetmeden en alt kategoriye inebilecek şekilde sorgumuzu tasarlayacağız. Categories Json biçimi categories/subcategories/subcategories şeklinde iç içe giden bir modele sahip. , Biz genel sorgumuzda Id, Name ve ParentId değerlerini görüntüleyeceğiz. Ancak sorgumuzda alt kategorilere ulaşabilmek için subcategories verisine de ihtiyacımız var. Bunun için SQL Server da Table Function oluşturacağız.
Create function [dbo].[fnGetNestedCategories](@jsonData nvarchar(max)) Returns @Returned Table(Id int, ParentId int, Name nvarchar(max)) as begin WITH NestedCategories(Id, ParentId, Name, SubCategories) as ( Select Cast(json_value(Category.[value], '$.id') as int) Id, Cast(json_value(Category.[value], '$.parentId') as int) ParentId, Cast(json_value(Category.[value], '$.name') as nvarchar(max)) Name, Cast(json_query(Category.[value], '$.subCategories') as nvarchar(max)) SubCategories From OPENJSON(@jsonData, '$.categories') Category union all Select Cast(json_value(SubCategories.[value], '$.id') as int) Id, Cast(json_value(SubCategories.[value], '$.parentId') as int) ParentId, Cast(json_value(SubCategories.[value], '$.name') as nvarchar(max)) Name, Cast(json_query(SubCategories.[value], '$.subCategories') as nvarchar(max)) SubCategories From NestedCategories outer apply openjson(NestedCategories.SubCategories) SubCategories Where NestedCategories.SubCategories is not null or NestedCategories.SubCategories <> '' ) Insert Into @Returned(Id, ParentId, Name) Select Id, ParentId, Name From NestedCategories Where Id is not null return end
Trendyol apilerinden veriler json formatında geliyor. Json formatındaki verileri alabilmek için OPENJSON komutundan faydalanacağız. OPENJSON array dizinlerinin içerisinde döngü oluşturarak değerleri okumamızı sağlar. Select sorgumuzda ise alanları alabilmek için json_value dan faydalanacağız. fnGetNestedCategories fonksiyonunu oluşturduk. Bu fonksiyonumuza jsonData parametresini alarak dışarıya Id, ParentId ve name alanlarından oluşan bir tablo veriyor.
Kategori bilgilerini alabilmemiz için ihtiyacımız olan tüm procedure leri oluşturduk. Şimdi sp_GetTrendyolCategories stored procedure une geldi. Bu procedure içerisinde responseData adında bir değişken tanımlayacağız. Sp_GetHttpRequest stored procedure umuze kategorileri alabileceğimiz url adresini, web methodunu, content type ını ve responseData parametrelerini verdikten sonra dönen değeri oluşturduğumuz fnGetNestedCategories fonksiyonuna göndererek oradan gelen değerleri görüntüleyeceğiz.
Trendyol API lerinde Kategori, kategori özellikleri gibi API lerde herhangi bir authorization istemediği için sp_GetHttpRequest proc una authorization değeri göndermedik. Sorgumuzu çalıştırdığımızda ParentId değeri null olanlar en üst kategoriler diğerleri ise birbirine bağlı alt kategoriler şeklinde geldiğini görebiliriz.
Create proc [dbo].[sp_GetTrendyolCategories] as begin Declare @responseData nvarchar(max) exec sp_GetHttpRequest 'https://api.trendyol.com/sapigw/product-categories', 'GET', 'application/json', null, null, null, null, @responseData out select * From dbo.fnGetNestedCategories(@responseData) order By ParentId, Id end
Stored Procedure sorgumuzun sonucu :
Kategori Özelliklerini ve Değerlerini Çekme
Trendyolda her bir kategoriye ait özellikleri alabilmemiz için
https://api.trendyol.com/sapigw-product/product-categories/{categoryId}/attributes adresine istek göndereceğiz.
Trendyol bu adresteki verileri Attributes/AttributeValues şeklinde tutuyor. Örneğin bir kategoride Beden Attribute var. Bu attribute un S, M, X vs. Attribute value larını tutuyor. Bu iki değeri bu adresten alıp sorgumuzu oluşturacağız.
Bu işlem için sp_GetTrendyolCategoryAttributes stored procedure oluşturacağız. Bu procedure dışarıdan categoryId parametresini alacak. Procdure içerisinde responseData ve urlAddress adında iki ayrı değişkeni tanımlıyoruz. url address değişkenine kategori özelliklerini alabileceğimiz api adresini veriyoruz. Ardından sp_GetHttpRequest stored procedure yine aynı şekilde urlAddresi, web methodu, contenttype ı ve responseData yı parametre olarak verip dönen değeri sorgumuzda kullanacağız.
Burada gelen json datasını iki ayrı sorgu ile alacağız. Birinci sorgumuzda sadece kategori özelliklerini ikinci sorgumuzda ise bu kategori özelliklerine bağlı değerleri listeleyeceğiz.
Bunun için birinci sorgumuzda openjson da categoryAttributes arrayine adresleyeceğiz. İkinci sorgumuzda ise tekrar üst kategori bilgisini almak için categoryAttributes değerlerini
almak için ise crossapply ile attributevalues u adresleyeceğiz.
Şimdi oluşturduğumuz procedure test edelim. Procedure a category Id parametremize 3171 değerini verip çalıştırdığımızda ekrandaki gibi Renk, Beden, Yaş Grubu, gibi özellikler gelirken ikinci sorgumuzda ise Beden Id sine bağlı L, M, S gibi değerlerin geldiğini görürüz.
Create proc [dbo].[sp_GetTrendyolCategoryAttributes] @categoryId nvarchar(max) as begin Declare @responseData nvarchar(max) Declare @urlAddress nvarchar(max) set @urlAddress = 'https://api.trendyol.com/sapigw/product-categories/' + @categoryId + '/attributes' exec sp_GetHttpRequest @urlAddress, 'GET', 'application/json', null, null, null, null, @responseData out -- Attributes -- Select json_value(Attributes.[value], '$.categoryId') CategoryId, json_value(Attributes.[value], '$.attribute.id') AttributeId, json_value(Attributes.[value], '$.attribute.name') AttributeName, json_value(Attributes.[value], '$.allowCustom') AllowCustom, json_value(Attributes.[value], '$.required') [Required], json_value(Attributes.[value], '$.varianter') Varianter, json_value(Attributes.[value], '$.slicer') Slicer From OPENJSON(@responseData, '$.categoryAttributes') Attributes -- /Attributes -- -- AttributeValues -- Select json_value(Attributes.[value], '$.attribute.id') AttributeId, json_value(AttributeValues.[value], '$.id') ValueId, json_value(AttributeValues.[value], '$.name') ValueName From OPENJSON(@responseData, '$.categoryAttributes') Attributes cross apply OPENJSON(Attributes.[value], '$.attributeValues') AttributeValues -- /AttributeValues -- end
Ürün Listesi Çekme
Trendyolda kategori, kategori özellikleri ve/veya marka bilgilerini çekerken herhangi bir authorization ihtiyacımız yoktu. Ancak mağazamıza ait ürün listesini alırken authorization ve satıcı id bilgilerine ihtiyacımız bulunuyor. Trendyoldan ürünlerimizin listesini çekebilmek için https://api.trendyol.com/sapigw/suppliers/{supplierId}/products adresine istek göndereceğiz. Ancak bu kez authorization bilgilerini vererek bu sorguyu oluşturacağız. Bu sorgu için farklı parametreler bulunuyor. Bu parametreleri adresin sonuna querystring olarak ekleyebilirsiniz. Parametreler;
- approved : Onaylı / Onaysız ürünlerin listesini çekmek için kullanılır.
- barcode: Tekli barkod sorgulamak için gönderilir.
- stockCode : Stok koduna göre tek bir ürünün alabilmek için kullanılır.
- page : Vereceğiniz size değerine göre istediğiniz sayfadaki ürünleri listeler
- size: Bir sayfada listelenecek maks ürün adeti belirtir
Biz sorgumuzda size ve page parametrelerini kullanacağız.
Sp_GetTrendyolProducts stored procedure oluştururken dışarıdan supplierId, apiKey, apiSecretKey, page ve size parametrelerini alacağız. Procedure umuzun içerisinde ise responseData, authorization ve urlAddress değişkenleri oluşturacağız. Authorization için apikey ve apisecretkey değerlerinin arasına iki nokta koyarak base64 fonksiyonumuza gönderiyoruz. Buradan gelen değeri authorization değişkenimize eşitliyoruz.
Sp_GetHttpRequest procedure umuze urladdress, web method, contenttype, authorization ve responsedata değişkenlerimizi gönderiyoruz. Gelen ResponseData yı openjson ile $.content array ine adresliyoruz. Ardından sırasıyla StockCode, title, categoryName, quantity, stockunittype, saleprice, approved ve barcode değerlerini gösterecek şekilde sorgumuzu düzenliyoruz.
Sp_GetTrendyolProducts stored procedure test etmek için supplierId, apikey, apisecretkey, page ve size parametreleriyle çalıştıralım. supplierId, apikey, apisecretkey özel bilgi olduğu için bu bilgileri ekranda gösteremeyeceğim. Procedure umuzu çalıştırdığımızda ekrandaki gibi bilgilerin geldiğini görebilirsiniz.
create proc [dbo].[sp_GetTrendyolProducts] @supplierId nvarchar(max), @apiKey nvarchar(max), @apiSecretKey nvarchar(max), @page nvarchar(max), @size nvarchar(max) as begin Declare @responseData nvarchar(max) Declare @authorization nvarchar(max) Declare @urlAddress nvarchar(max) select @authorization = 'Basic ' + dbo.fnBase64Encode(@apiKey + ':' + @apiSecretKey) set @urlAddress = 'https://api.trendyol.com/sapigw/suppliers/' + @supplierId + '/products?page=' + @page + '&size=' + @size exec sp_GetHttpRequest @urlAddress, 'GET', 'application/json', @authorization, null, null, null, @responseData out select json_value(products.[value], '$.stockCode') StockCode, json_value(products.[value], '$.title') Title, json_value(products.[value], '$.categoryName') CategoryName, json_value(products.[value], '$.quantity') Quantity, json_value(products.[value], '$.stockUnitType') StockUnitType, json_value(products.[value], '$.salePrice') SalePrice, json_value(products.[value], '$.approved') Approved, json_value(products.[value], '$.barcode') Barcode From OPENJSON(@responseData, '$.content') products order by json_value(products.[value], '$.categoryName') end
Trendyol API Sipariş Listesini Çekme
Bu videomuzun son konusu ise sipariş listesini çekmek. Trendyolda sipariş listesini çekebilmek için https://api.trendyol.com/sapigw/suppliers/{supplierId}/orders adresine istek göndereceğiz.
Bunun için sp_GetTrendyolOrders adında stored procedure oluşturacağız. Bu procedure da dışarıdan supplierId, apikey, apisecretkey, page ve size parametrelerini alacak.
Procedure içerisinde responsedata, urladdress, authorization adında değişken tanımlayacağız. Authorization değişkenimizi products ta olduğu gibi değerini base64 olarak atıyoruz.
Sp_GetHttpRequest stored procedure mıza urladdress, web method, content type, authorization ve responsedata parametrelerimizi veriyoruz. Dönen değeri orderheader ve order detail olarak iki ayrı sorguda oluşturacağız.
İlk sorgumuzda responsedata yı content arrayine adresleyip siparişlerimizin üst bilgilerini çekiyoruz. Burada dikkat etmemiz gereken konu orderdate utc olarak geliyor. Bunu bu günki tarihe dönüştürmemiz gerekiyor. Bir alt kırılımda ise invoice address ve shipment address bilgilerini alıyoruz.
İkinci sorgumuzda ise responsedata ve ona bağlı sipariş detaylarını alıyoruz. Sipariş detaylarında da stok kodu stok adı miktar ve fiyat bilgilerini çekiyoruz.
create proc [dbo].[sp_GetTrendyolOrders] @supplierId nvarchar(max), @apiKey nvarchar(max), @apiSecretKey nvarchar(max), @page nvarchar(max), @size nvarchar(max) as begin Declare @responseData nvarchar(max) declare @urlAddress nvarchar(max) declare @authorization nvarchar(max) select @authorization = 'Basic ' + dbo.fnBase64Encode(@apiKey + ':' + @apiSecretKey) set @urlAddress = 'https://api.trendyol.com/sapigw/suppliers/' + @supplierId + '/orders?page=' + @page + '&size=' + @size exec sp_GetHttpRequest @urlAddress, 'GET', 'application/json', @authorization, null, null, null, @responseData out -- ORDER HEADER -- Select json_value(OrderHeader.[value], '$.orderNumber') OrderNumber, Cast(DateAdd(SECOND, Cast(json_value(OrderHeader.[value], '$.orderDate') as bigint) /1000, '1970/1/1') as datetime) OrderDate, json_value(OrderHeader.[value], '$.invoiceAddress.fullName') InvoiceAddressFullName, json_value(OrderHeader.[value], '$.invoiceAddress.fullAddress') InvoiceAddressFullAddress, json_value(OrderHeader.[value], '$.shipmentAddress.fullName') ShipmentAddressFullName, json_value(OrderHeader.[value], '$.shipmentAddress.fullAddress') ShipmentAddressFullAddress, json_value(OrderHeader.[value], '$.tcIdentityNumber') TCIdentityNumber, json_value(OrderHeader.[value], '$.customerFirstName') CustomerFirstName, json_value(OrderHeader.[value], '$.customerLastName') CustomerLastName, json_value(OrderHeader.[value], '$.shipmentPackageStatus') ShipmentPackageStatus, json_value(OrderHeader.[value], '$.status') [Status], json_value(OrderHeader.[value], '$.totalPrice') TotalPrice, json_value(OrderHeader.[value], '$.currencyCode') CurrencyCode From OPENJSON(@responseData, '$.content') OrderHeader -- /ORDER HEADER -- -- Order Detail -- Select json_value(OrderHeader.[value], '$.orderNumber') OrderNumber, json_value(OrderDetail.[value], '$.sku') StockCode, json_value(OrderDetail.[value], '$.productName') ProductName, json_value(OrderDetail.[value], '$.quantity') Quantity, json_value(OrderDetail.[value], '$.price') Price From OPENJSON(@responseData, '$.content') OrderHeader cross apply OPENJSON(OrderHeader.[value], '$.lines') OrderDetail -- /Order Detail -- end
İyi çalışmalar dilerim.
Bu yazıya 2 yorum yapılmış.
Postman üzerinde api key alanında deneme yapmak isteyen arkadaşlar için not düşmek istedim. Key adı : authorization Value değeri : fnBase64Encode functions ile oluşan değer. örnek hali: Basic MUV5RG********* gibi sql üzerinde bu değeri ilgili function ile alabilirsiniz.. ------ Declare @authorization nvarchar(max) Declare @apiKey nvarchar(max) = 'senin trendyol apikey value değerin' Declare @apiSecret nvarchar(max) = 'senin trendyol api secret value değerin' select @authorization = ' Basic ' + dbo.fnBase64Encode(@apiKey + ':' + @apiSecret)
Merhaba, Trendyol ürün listesini sql de çektirdiğimde boş geliyor. Postman üzerinde linki girip api key eklediğimde sadece ürün sayısı geliyor.. Neyi gözden kaçırdığımı anlayamadım. Ekran görüntüsü atabilirim mail paylaşımı yapabilirseniz. Paylaşım çok faydalı..Paylaşım için çok çk teşekkürler...saygılarımla