Bu videomuzda Trendyol API lerinden veri çekmeyi göreceğiz.....

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. 


 

 

 

İlgili Makaleler

Bu yazıya 2 yorum yapılmış.

  • TRENDYOL ÜRÜN LİSTESİ -

    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)

  • TRENDYOL ÜRÜN LİSTESİ -

    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

Yorum Gönder