﻿
{"id":15872,"date":"2020-05-17T22:23:53","date_gmt":"2020-05-17T22:23:53","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=15872"},"modified":"2020-05-17T22:23:53","modified_gmt":"2020-05-17T22:23:53","slug":"asp-net-core-web-api-uygulamasina-odata-implementasyonu","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-web-api-uygulamasina-odata-implementasyonu\/","title":{"rendered":"Asp.NET Core Web API Uygulamas\u0131na OData Implementasyonu"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bir \u00f6nceki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/odata-nedir-graphqlden-farki-nedir\/\" rel=\"noopener noreferrer\" target=\"_blank\">OData Nedir? GraphQL\u2019den Fark\u0131 Nedir?<\/a> ba\u015fl\u0131kl\u0131 makalemizde OData&#8217;n\u0131n ne oldu\u011fundan ve muadili olan GraphQL&#8217;le aras\u0131ndaki fark\u0131n neler oldu\u011fundan bahsetmi\u015ftik. Bu i\u00e7eri\u011fimizde ise pratiksel a\u00e7\u0131dan Asp.NET Core Web API uygulamalar\u0131na OData protokol\u00fcn\u00fcn nas\u0131l implemente edilebilece\u011fini ve b\u00f6ylece API&#8217;lara entity \u00fczerinde sorgulama yetene\u011finin kazand\u0131r\u0131labilmesi i\u00e7in neler yap\u0131lmas\u0131 gerekti\u011fini inceleyece\u011fiz.<\/p>\n<blockquote><p><strong style=\"color:orange;\">OData bir protokold\u00fcr. Protokol; iki farkl\u0131 sistemin birbiriyle nas\u0131l haberle\u015fece\u011fini belirleyen kurallar b\u00fct\u00fcn\u00fcd\u00fcr.<\/strong><\/p><\/blockquote>\n<h3>Implementasyon<\/h3>\n<p>OData&#8217;y\u0131 uygulaman\u0131za entegre edebilmeniz i\u00e7in <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.OData\/\" rel=\"noopener noreferrer\" target=\"_blank\">Microsoft.AspNetCore.OData<\/a> k\u00fct\u00fcphanesini y\u00fcklemeniz yeterlidir.<\/p>\n<p>Ard\u0131ndan &#8216;Startup.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki konfig\u00fcrasyonlar\u0131n yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddOData();\r\n            .\r\n            .\r\n            .\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            var builder = new ODataConventionModelBuilder();\r\n            builder.EntitySet&lt;Personel&gt;(&quot;Personel&quot;);\r\n            builder.EntitySet&lt;Kategori&gt;(&quot;Kategori&quot;);\r\n\r\n            app.UseEndpoints(endpoints =&gt;\r\n            {\r\n                endpoints.MapODataRoute(&quot;odata&quot;, &quot;odata&quot;, builder.GetEdmModel());\r\n            });\r\n            .\r\n            .\r\n            .\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelersek e\u011fer; <em><strong>8.<\/strong><\/em> sat\u0131rda &#8216;AddOData&#8217; metoduyla uygulamaya OData servisi eklenmektedir. <em><strong>19 &#8211; 21.<\/strong><\/em> sat\u0131rlarda &#8216;ODataConventionModelBuilder&#8217; t\u00fcr\u00fcnden nesne ile entitylerin nas\u0131l sorgulanaca\u011f\u0131n\u0131 bildirece\u011fimiz bir convention tan\u0131ml\u0131yoruz ve &#8216;EntitySet&#8217; metotlar\u0131yla belirtilen entitylere sorgulama yetene\u011fini kazand\u0131rmak i\u00e7in bildiride bulunuyoruz. Burada \u00f6zellikle &#8216;EntitySet&#8217; metodunun parametresine kullan\u0131lacak olan controller&#8217;\u0131n ismini belirtmeye dikkat ediyoruz(<span style=\"font-size:10px;\">\u00d6rn; &#8216;PersonelController&#8217;<\/span>) <strong><em>25.<\/em><\/strong> sat\u0131rda ise &#8216;MapODataRoute&#8217; metodu ile OData protokol\u00fcne uygun &#8216;www.example.com\/<span style=\"color:blue;\">odata<\/span>\/<span style=\"color:blue;\">{controller}&#8217;<\/span> format\u0131nda bir rota olu\u015fturuyoruz ve &#8216;GetEdmModel'(<span style=\"font-size:10px;\">Edm : Entity Data Model<\/span>) ile belirtilen entityler i\u00e7erisindeki navigation propertyleri ve di\u011fer t\u00fcm \u00f6zellikleri olu\u015fturulacak rotaya dahil ediyoruz.<\/p>\n<p>&#8216;Startup.cs&#8217; dosyas\u0131nda yap\u0131lan bu konfig\u00fcrasyondan sonra istekleri kar\u015f\u0131layacak olan controller&#8217;lar\u0131 a\u015fa\u011f\u0131daki gibi tan\u0131ml\u0131yoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class KategoriController : ODataController\r\n    {\r\n        NorthwindContext _northwindContext;\r\n        public KategoriController(NorthwindContext northwindContext)\r\n        {\r\n            _northwindContext = northwindContext;\r\n        }\r\n        &#x5B;EnableQuery]\r\n        public IActionResult Get()\r\n        {\r\n            return Ok(_northwindContext.Kategoriler.ToList());\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class PersonelController : ODataController\r\n    {\r\n        NorthwindContext _northwindContext;\r\n        public PersonelController(NorthwindContext northwindContext)\r\n        {\r\n            _northwindContext = northwindContext;\r\n        }\r\n        &#x5B;EnableQuery]\r\n        public IActionResult Get()\r\n        {\r\n            return Ok(_northwindContext.Personeller.ToList());\r\n        }\r\n    }\r\n<\/pre>\n<p>\u00d6rnek olarak ele ald\u0131\u011f\u0131m\u0131z her iki controller&#8217;\u0131 incelerseniz e\u011fer &#8216;ApiController&#8217; ve &#8216;Route&#8217; attributelar\u0131 kald\u0131r\u0131lm\u0131\u015f ve &#8216;ControllerBase&#8217; yerine &#8216;ODataController&#8217;dan t\u00fcretilmi\u015flerdir. Bu \u015fekilde tasarlanmalar\u0131n\u0131n sebebi, art\u0131k t\u00fcm kontrol\u00fcn OData \u00fczerinde olmas\u0131ndan kaynaklanmaktad\u0131r. OData var olan katman \u00fczerine yenisini ekleyerek, controller&#8217;lardaki sorumlulu\u011fu \u00fcstlenmektedir. Ayriyetten her iki controller i\u00e7erisindeki &#8216;Get&#8217; fonksiyonlar\u0131na g\u00f6z atarsan\u0131z e\u011fer &#8216;EnableQuery&#8217; attribute&#8217;u ile i\u015faretlenerek bu controller&#8217;lar\u0131n &#8216;Startup.cs&#8217; dosyas\u0131nda tan\u0131mlanan entityleri \u00fczerinden sorgulanma yetenekleri kazand\u0131r\u0131lmaktad\u0131r.<\/p>\n<h4>Test<\/h4>\n<p>Olu\u015fturulan controller&#8217;lara normal istek g\u00f6nderirsek e\u011fer;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-300x209.jpg\" alt=\"Asp.NET Core Web API Uygulamas\u0131na OData Implementasyonu\" width=\"400\" height=\"300\" class=\"alignleft size-medium wp-image-15895\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere i\u00e7erisinde birazdan de\u011finece\u011fimiz metadata bilgisini bar\u0131nd\u0131ran &#8220;@data.context&#8221; ile verileri bar\u0131nd\u0131ran &#8220;value&#8221; alanlar\u0131na sahip bir result olu\u015fturularak, g\u00f6nderilmektedir. Dolay\u0131s\u0131yla burada OData \u00fczerinden yap\u0131lan sorgulamalar neticesinde elde edilen verilerin &#8216;value&#8217; alan\u0131ndan elde edilece\u011fine dikkatinizi \u00e7ekerim.<\/p>\n<p>Tabi burada sonraki makalemizde detayl\u0131ca inceleyece\u011fimiz query option&#8217;lardan &#8216;$select&#8217; parametresini kullanarak belirtilen alanlar\u0131n gelip gelmedi\u011fini de denetleyerek olu\u015fturdu\u011fumuz yap\u0131lanman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 kontrol etmemizde fayda vard\u0131r.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-1-300x208.jpg\" alt=\"\" width=\"400\" height=\"300\" class=\"alignright size-medium wp-image-15899\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere url \u00fczerinde <span style=\"color:orange;\">https:\/\/localhost:5001\/odata\/ personel?<span style=\"color:blue;\">$select=adi, soyadi<\/span><\/span> \u015feklinde belirtilen bir query string ile kaynaktan gelecek olan verilerin sadece &#8216;adi&#8217; ve &#8216;soyadi&#8217; kolonlar\u0131n\u0131n elde edilmesini bildirmi\u015f bulunmaktay\u0131z.<\/p>\n<p>Yap\u0131lan istek neticesinde OData protokol\u00fcn\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve url \u00fczerinden sorgulaman\u0131n ba\u015far\u0131l\u0131 bir \u015fekilde ger\u00e7ekle\u015fti\u011fini g\u00f6zlemlemi\u015f bulunmaktay\u0131z.<\/p>\n<h3>OData Metadata<\/h3>\n<p>Client, &#8216;Startup.cs&#8217; dosyas\u0131nda OData&#8217;ya set edilen entitylerin hangi propertylere sahip oldu\u011funu g\u00f6rebilmek i\u00e7in metadata iste\u011finde bulunulabilmektedir. Bu istek neticesinde bir nevi servis d\u00f6k\u00fcmanlar\u0131 olu\u015fturulacak ve client&#8217;a g\u00f6nderilecektir. Bir url \u00fczerinden metadata bilgilerini talep edebilmek i\u00e7in <span>$metadata<\/span> etiketinin kullan\u0131lmas\u0131 yeterli olacakt\u0131r.<\/p>\n<p><strong>Uygulamada Kullan\u0131lan T\u00fcm Entityleri Sorgulamak<\/strong><br \/>\nUygulamada OData i\u00e7in set edilen t\u00fcm entitylerin metadata bilgilerine eri\u015febilmek i\u00e7in <span style=\"color:red;\">\/odata?$metadata<\/span> url&#8217;ine istek g\u00f6nderilmesi yeterli olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-2.jpg\" alt=\"Asp.NET Core Web API Uygulamas\u0131na OData Implementasyonu\" width=\"616\" height=\"509\" class=\"aligncenter size-full wp-image-15912\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-2.jpg 616w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-2-300x248.jpg 300w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere uygulamada &#8216;Personel&#8217; ve &#8216;Kategori&#8217; olmak \u00fczere iki adet entity&#8217;nin var oldu\u011fu bilgisi gelmekte ve b\u00f6ylece t\u00fcm entityler kulland\u0131\u011f\u0131 url bilgisiyle birlikte listelenmektedir. <\/p>\n<p><strong>Entitylerin Propertylerini Sorgulamak<\/strong><br \/>\nMevcut entitylerin bar\u0131nd\u0131rd\u0131\u011f\u0131 alanlar\u0131 sorgulamak i\u00e7in <span style=\"color:red;\">\/odata\/$metadata<\/span> \u015feklinde istek g\u00f6nderilmesi gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-3.jpg\" alt=\"Asp.NET Core Web API Uygulamas\u0131na OData Implementasyonu\" width=\"627\" height=\"488\" class=\"aligncenter size-full wp-image-15915\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-3.jpg 627w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Web-API-Uygulamas\u0131na-OData-Implementasyonu-3-300x233.jpg 300w\" sizes=\"auto, (max-width: 627px) 100vw, 627px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere istek neticesinde entitylerin propertyleri listelenmekte ve b\u00f6ylece client neye g\u00f6re sorgulama yapaca\u011f\u0131n\u0131 bilebilmektedir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bir \u00f6nceki OData Nedir? GraphQL\u2019den Fark\u0131 Nedir? ba\u015fl\u0131kl\u0131 makalemizde OData&#8217;n\u0131n ne oldu\u011fundan ve muadili olan GraphQL&#8217;le aras\u0131ndaki fark\u0131n neler oldu\u011fundan bahsetmi\u015ftik. Bu i\u00e7eri\u011fimizde ise pratiksel a\u00e7\u0131dan Asp.NET Core Web API uygulamalar\u0131na OData protokol\u00fcn\u00fcn&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":15889,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3516],"tags":[3520,3519,3514,3521],"class_list":["post-15872","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-odata","tag-api-odata","tag-asp-net-core-web-api-odata","tag-odata","tag-odata-asp-net-core-implementation"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=15872"}],"version-history":[{"count":40,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15872\/revisions"}],"predecessor-version":[{"id":15917,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15872\/revisions\/15917"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/15889"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=15872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=15872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=15872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}