OData (Open Data Protocol), web tabanlı hizmetler arasında veri paylaşımını kolaylaştırmak için kullanılan bir açık protokoldür. OData, REST (Representational State Transfer) prensiplerine dayanır ve HTTP protokolünü kullanarak kaynaklara (örneğin veritabanları, dosya sistemleri, servisler) erişim sağlar. Bu protokol, verilerin standart bir şekilde tarif edilmesini ve paylaşılmasını destekler.
OData’nın temel özellikleri şunlardır:
- Veri Erişimi ve Dolaşımı: OData, kaynaklara erişim ve bu kaynaklar arasında dolaşım sağlamak için bir URL tabanlı sistem kullanır.
- Veri Modelleme: OData, veriyi tanımlamak ve modellemek için standart bir veri modeli kullanır. Bu genellikle Entity Data Model (EDM) olarak adlandırılır.
- HTTP Tabanlı: OData protokolü, HTTP protokolünü temel alır. Bu sayede standart HTTP metotları (GET, POST, PUT, DELETE) kullanılarak verilere erişim sağlanabilir.
- Atom ve JSON Formatları: OData, verileri Atom XML veya JSON formatlarında döndürebilme yeteneğine sahiptir. Bu, farklı uygulama ve platformlar arasında esnek veri iletişimi sağlar.
- Filtreleme ve Sıralama: OData, verileri filtreleme ve sıralama gibi işlemleri destekler, bu da kullanıcılara daha spesifik veri talepleri yapma olanağı tanır.
OData, özellikle bulut tabanlı uygulamalar, RESTful web servisleri ve veri entegrasyonu alanında kullanılır. Microsoft, SAP, IBM ve diğer birçok büyük teknoloji şirketi OData’ya destek vermiştir, bu da protokolün yaygın bir şekilde kullanılmasına katkı sağlamıştır.
Asp.NET Web API ve OData
ASP.NET Web API ve OData, birlikte kullanıldığında, veri hizmetlerini standartlaştırmak, sorgulamak ve tüketmek için güçlü bir çözüm sunar. OData protokolü, kaynaklara (veri tabanları, dosyalar, servisler vb.) standart CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirmek için HTTP üzerinden sorgular yapma yeteneği sağlar. Ayrıca, sorguları genişletmek ve filtrelemek için bir dizi özellik sunar.
ASP.NET Web API ve OData’nın bir arada kullanılmasıyla ilgili temel gereksinimler:
- NuGet Paketleri: Projenize OData desteğini eklemek için gerekli NuGet paketlerini ekleyin. Örneğin,
Microsoft.AspNetCore.OData
paketini ekleyebilirsiniz.
dotnet add package Microsoft.AspNetCore.OData
- Veri Modelini Tanımlayın: OData sorgularını işleyeceğiniz veri modelini tanımlayın. Bu genellikle bir Entity Framework modeli olabilir.
public class People
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<People> Peoples { get; set; }
}
- OData Hizmetini Yapılandırın: OData servislerini eklemek ve yapılandırmak için
AddOData
metodu kullanılır.
public class Program
{
private static IEdmModel GetEdmModel()
{
ODataConventionModelBuilder builder = new();
builder.EntitySet<People>("Peoples");
return builder.GetEdmModel();
}
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers().AddOData(options => options.AddRouteComponents("V1", GetEdmModel()).Filter().Select().Expand().OrderBy());
//...
}
}
options => options.AddRouteComponents("V1", GetEdmModel()).Filter().Select().Expand()
: Bu bölüm, OData servislerinin yapılandırılmasını sağlar.
AddRouteComponents("V1", GetEdmModel())
: Bu, OData hizmetine bir sürüm ekler. “V1” burada bir sürüm adıdır. Ayrıca,GetEdmModel()
metodu, OData modelini tanımlar.Filter()
: Bu, OData sorgularında filtreleme işlemini etkinleştirir. Örneğin,$filter
kullanılarak veri setini filtrelemek mümkün olur.Select()
: Bu, OData sorgularında sorgu sonucunda dönen veri setinin hangi özellikleri içereceğini belirlemek için kullanılır. Örneğin,$select
kullanılarak belirli alanları seçmek mümkün olur.Expand()
: Bu, OData sorgularında ilişkili veri setlerini dönmek için kullanılır.$expand
kullanılarak ilişkili veri setleri alınabilir.OrderBy()
: OData sorgularında derecelendirme (sorting) işlemini etkinleştirir.$orderby
kullanarak sıralama yapabilirsiniz.Count().SkipToken()
: OData sorgularında sayfalama işlemini etkinleştirir.$top
,$skip
, ve$count
gibi sayfalama parametrelerini kullanabilirsiniz.EnableQueryFeatures()
: OData sorgularında anahtar değişikliklerini izlemeyi etkinleştirir. Bu,$delta
gibi özellikleri kullanmanıza olanak tanır.- Ve diğerleri…
GetEdmModel
metodu, OData servisinin metaveri modelini oluşturan bir fonksiyondur. Bu model, OData sorgularını işlemek için kullanılan varlık türlerini, ilişkileri ve diğer önemli bilgileri içerir. Eğer GetEdmModel
fonksiyonunu kullanmazsanız, OData servisiniz metaveri modeline sahip olmaz ve bu, sorguların işlenmesini ve yönlendirilmesini zorlaştırabilir.
builder.Services.AddControllers().AddOData(options => options.AddRouteComponents("V1").Filter().Select().Expand());
Bu kod parçası, ASP.NET Core 6.0 ile OData servislerini ekleyip yapılandırmak için kullanılan yaygın bir örnektir. Bu yapılandırma, OData servisinin genel davranışını belirler ve bu davranışlar OData sorgularını daha fazla kontrol etmenize olanak tanır.
- ODataController Kullanımı: ODataController, ASP.NET Web API controller’larına OData özellikleri eklemek için kullanılır. Bu controller, OData standartlarını takip eden sorgu ve filtreleme işlemlerini destekler.
[Route("api/[controller]")]
[ApiController]
[EnableQuery]
public class ValuesController : ODataController
{
private readonly AppDbContext _context;
public ValuesController(AppDbContext context)
{
_context = context;
}
[HttpGet]
public IActionResult Get()
{
// Veri kaynağınızdan ürünleri getirme işlemi
return Ok(_context.Peoples);
}
}
EnableQuery
niteliği, ASP.NET ODataController sınıflarında kullanılan bir niteliktir ve OData sorgularının uygulanmasına izin verir. Bu nitelik, OData sorgu yeteneklerini açar ve bir ODataController içindeki IQueryable
döndüren metodların OData sorgularını kullanabilmesini sağlar.
- OData Sorgularını Kullanın: OData sorgularını kullanarak kaynaklara erişim sağlayabilirsiniz. Örneğin:
$filter
: Veri setini filtreleme$orderby
: Veri setini sıralama$top
,$skip
: Sayfalama$select
: Belirli alanları seçme$expand
: İlişkili veri setlerini genişletme
Örnek bir sorgu: https://localhost:7242/api/Values?$filter=age lt 25&$orderby=Name asc
II. Yöntem (ODataQueryOptions)
ODataQueryOptions
sınıfı, OData sorgularını işlemek ve analiz etmek için ASP.NET Core uygulamalarında kullanılan bir sınıftır. Bu sınıf, gelen OData sorgularını temsil eder ve bu sorguların işlenmesini sağlar. Genellikle, bu sınıfı ODataController sınıflarında kullanarak gelen sorguları analiz edebilir ve buna göre veri tabanından veri çekebilirsiniz. ODataQueryOptions
sınıfını herhangi bir konfigürasyon yapmadan direk controller içerisinde kullanabilirsiniz.
//GET: /api/Values/GetPerson
[HttpGet]
[Route("[action]")]
public IActionResult GetPerson(ODataQueryOptions<Product> options)
{
// OData sorgularına erişim
var filter = options.Filter?.RawValue;
var orderBy = options.OrderBy?.RawValue;
// Veri tabanından sorguya uygun veri çek
var queryableData = _context.Peoples.AsQueryable();
var result = options.ApplyTo(queryableData);
// Sonuçları döndür
return Ok(result);
}
ODATA Kullanımı
ASP.NET Web API üzerinde OData kullanarak çeşitli işlemler gerçekleştirebilirsiniz. İşte OData ile ASP.NET Web API üzerinde yapılabilecek bazı işlemler:
- Veri Çekme: Aşağıdaki istek People listesi döndürür.
//GET /api/Values
[HttpGet]
[EnableQuery]
public IActionResult Get()
{
// Veri kaynağınızdan ürünleri getirme işlemi
return Ok(_context.Peoples);
}
- Veri Sorgulama ve Filtreleme: OData ile belirli bir yaşın üzerindeki kişileri sorgulamak için:
GET /api/Values?$filter=Age ge 30
- Veri Sıralama: Kişileri yaşlarına göre azalan sırayla sıralamak için:
GET /api/Values?$orderby=Age desc
- Veri Sayfalama: Sayfalama kullanarak belirli bir sayfa numarasındaki kişileri çekmek için:
GET /api/Values?$top=10&$skip=20
- Belirli Alanları Seçme: Sadece kişinin adını ve yaşını çekmek için:
GET /api/Values?$select=Name,Age
- İlişkili Veri Setlerini Genişletme: Kişilere ait bir ilişkili veri setini (örneğin, kişinin sahip olduğu bir liste) genişletmek için:
GET /api/Values?$expand=OwnedItems
- ID’ye Göre Veri Çekme: Aşağıdaki istek, verilen Kullanıcı Adı “russellwhyte” tarafından Kişi türündeki ayrı bir varlığı döndürür.
//GET: /api/Values/2
[HttpGet("{id}")]
[EnableQuery]
public IActionResult GetById(int id)
{
// Veri kaynağınızdan ürünleri id'ye göre getirme işlemi
return Ok(_context.Peoples.FirstOrDefault(x => x.Id == id));
}
- Veri Oluşturma (POST): Yeni bir kişi eklemek için:
/* POST /api/Values
Content-Type: application/json
{
"Name": "İlknur",
"Age": 29
} */
[HttpPost]
[EnableQuery]
public IActionResult Post([FromBody] People person)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_context.Peoples.Add(person);
_context.SaveChanges();
return Ok(person);
}
- Veri Güncelleme (PUT veya PATCH): Kişinin yaşını güncellemek için:
/* PUT /api/Values/1
Content-Type: application/json
{
"Age": 36
} */
[HttpPut("{id}")]
[EnableQuery]
public IActionResult Put(int id, [FromBody] People updatedPerson)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != updatedPerson.Id)
{
return BadRequest();
}
_context.Entry(updatedPerson).State = EntityState.Modified;
try
{
_context.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!PersonExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(updatedPerson);
}
- Veri Silme (DELETE): Bir kişiyi silmek için:
//DELETE /api/Values/1
[HttpDelete("{id}")]
[EnableQuery]
public IActionResult Delete(int id)
{
var person = _context.Peoples.Find(id);
if (person == null)
{
return NotFound();
}
_context.Peoples.Remove(person);
_context.SaveChanges();
return NoContent();
}
- Veri Metadata’sini Alma:
GET /api/Values$metadata
- İşlem ve İş Akışlarını Tanımlama: Özel işlemler veya iş akışları tanımlanabilir.
- Security (Güvenlik): Güvenlik önlemleri, örneğin yetkilendirme ve kimlik doğrulama, uygulanabilir.
Bu örneklerde, Person
nesnesi üzerinden OData sorgularını nasıl kullanabileceğinizi görebilirsiniz. OData, veritabanı tablolarını temsil eden nesneler üzerinde geniş bir sorgu ve manipülasyon yelpazesi sunar.
OData Sorgu İfadeleri
Eşitlik İfadeleri:
eq
: Eşit
GET /odata/People?$filter=Age eq 30
ne
: Eşit değil
GET /odata/People?$filter=Age ne 30
Karşılaştırma İfadeleri:
gt
: Büyükge
: Büyük eşitlt
: Küçükle
: Küçük eşit
GET /odata/People?$filter=Age gt 30
Mantıksal Operatörler:
and
: VEor
: VEYAnot
: DEĞİL
GET /odata/People?$filter=Age gt 30 and Age le 40
İçsel İfadeler:
contains
: Belirli bir dizeyi içeriyor mu?startswith
: Belirli bir dizeyle başlıyor mu?endswith
: Belirli bir dizeyle bitiyor mu?
GET /odata/People?$filter=contains(Name, 'John')
İçsel Fonksiyonlar: OData, bir dizi özel içsel fonksiyon sunar. Örneğin, length
, indexof
, tolower
, toupper
, trim
, vb.
GET /odata/People?$filter=length(Name) eq 5
Parantez Kullanımı: Parantezler, ifadeleri gruplandırmak için kullanılabilir.
GET /odata/People?$filter=(Age gt 30 or Age lt 20) and not contains(Name, 'John')
Any ve All Operatörleri:
any
: Belirli bir koleksiyon içinde en az bir öğe belirli bir koşulu sağlıyor mu?all
: Belirli bir koleksiyon içindeki tüm öğeler belirli bir koşulu sağlıyor mu?
GET /odata/People?$filter=Orders/any(o: o/Total gt 100)
Bu ifadeler, OData $filter
parametresi içinde kullanılabilen temel ifadelerdir. Farklı filtreleme senaryolarına uyacak şekilde bu ifadeleri birleştirebilir ve daha karmaşık sorgular oluşturabilirsiniz.
Kaynak Kod GitHub: https://github.com/alkanfatih/TutorialsOData