﻿
{"id":26041,"date":"2022-12-22T23:52:46","date_gmt":"2022-12-22T23:52:46","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26041"},"modified":"2022-12-22T23:58:31","modified_gmt":"2022-12-22T23:58:31","slug":"net-7-asp-net-core-grpc-uygulamalarinda-json-transcoding","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-7-asp-net-core-grpc-uygulamalarinda-json-transcoding\/","title":{"rendered":".NET 7 &#8211; Asp.NET Core gRPC Uygulamalar\u0131nda JSON Transcoding"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde <a href=\"https:\/\/www.gencayyildiz.com\/blog\/grpc-nedir-ne-amacla-ve-nasil-kullanilir\/\" rel=\"noopener\" target=\"_blank\">gRPC<\/a> teknolojisini REST API olarak kullanmam\u0131z\u0131 sa\u011flayacak olan .NET 7 ile gelen <em>JSON Transcoding<\/em> \u00f6zelli\u011fini t\u00fcm teferruatlar\u0131yla birlikte de\u011ferlendiriyor olaca\u011f\u0131z.<\/p>\n<p>gRPC, bilindi\u011fi \u00fczere y\u00fcksek performansl\u0131(high-performance) ve ger\u00e7ek zamanl\u0131(real-time) servisler \u00fcretmemizi sa\u011flayan, bir\u00e7ok avantaj\u0131n yan\u0131nda belli ba\u015fl\u0131 s\u0131n\u0131rl\u0131l\u0131klar bar\u0131nd\u0131ran <em>Remote Procedure Call(RPC)<\/em> framework&#8217;\u00fcd\u00fcr. gRPC&#8217;nin en b\u00fcy\u00fck s\u0131n\u0131rl\u0131l\u0131klar\u0131ndan biri her platforma uygun bir modele sahip olmamas\u0131d\u0131r. \u00d6zellikle web browser&#8217;lar\u0131n binary protokolleri yorumlayamamas\u0131 ve HTTP\/2 protokol\u00fcn\u00fc tam olarak desteklememesinden dolay\u0131 gRPC&#8217;nin getirdi\u011fi avantajlardan ziyade modern web uygulamalar\u0131nda hala REST API&#8217;lar ve JSON format\u0131ndaki veriler yerlerini korumaktad\u0131rlar.<\/p>\n<p>.NET 7 ile gelen <em>JSON Transcoding<\/em> \u00f6zelli\u011fi sayesinde art\u0131k gRPC servisleri i\u00e7in RESTful JSON API&#8217;lar\u0131 olu\u015fturabilir ve bildi\u011finiz HTTP konseptleri e\u015fli\u011finde gRPC&#8217;yi kullanabilirsiniz. B\u00f6ylece deneysel olarak <em>gRPC JSON Transcoding<\/em> ile HTTP API&#8217;lar\u0131n\u0131n yerini alacak alternatif bir \u00e7\u00f6z\u00fcm yolu \u00fcretebilirsiniz.<\/p>\n<blockquote><p><em>gRPC JSON Transcoding, deneysel olarak HTTP API&#8217;lar\u0131n yerini alabilecek alternatif bir \u00e7\u00f6z\u00fcm olabilir&#8230;<\/em><\/p><\/blockquote>\n<h4>Nas\u0131l Kullan\u0131l\u0131r?<\/h4>\n<p>gRPC JSON Transcoding \u00f6zelli\u011fini kullanabilmek i\u00e7in \u00f6ncelikle gRPC Server uygulamas\u0131na <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Grpc.JsonTranscoding\" rel=\"noopener\" target=\"_blank\">Microsoft.AspNetCore.Grpc.JsonTranscoding<\/a> k\u00fct\u00fcphanesinin y\u00fcklenmesi ve ard\u0131ndan &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki gibi <code>AddJsonTranscoding<\/code> servisi \u00e7a\u011fr\u0131larak uygulaman\u0131n yap\u0131land\u0131r\u0131lmas\u0131 gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing gRPC_Server.Services;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddCors(options =&gt; options.AddDefaultPolicy(policy =&gt; policy.AllowAnyMethod()\r\n                                                                             .AllowAnyHeader()\r\n                                                                             .AllowAnyOrigin()));\r\n\r\nbuilder.Services.AddGrpc()\r\n    .AddJsonTranscoding();\r\n\r\nvar app = builder.Build();\r\napp.UseCors();\r\n\r\napp.MapGrpcService&lt;MessageService&gt;();\r\napp.MapGet(&quot;\/&quot;, () =&gt; &quot;&quot;);\r\n\r\napp.Run();\r\n\r\n<\/pre>\n<\/div>\n<p>Bu konfig\u00fcrasyonlardan sonra projenin root dizininde &#8216;google\/api&#8217; path&#8217;i alt\u0131na <a href=\"https:\/\/github.com\/dotnet\/aspnetcore\/blob\/main\/src\/Grpc\/JsonTranscoding\/test\/testassets\/Sandbox\/google\/api\/http.proto\" rel=\"noopener\" target=\"_blank\">http.proto<\/a> ve <a href=\"https:\/\/github.com\/dotnet\/aspnetcore\/blob\/main\/src\/Grpc\/JsonTranscoding\/test\/testassets\/Sandbox\/google\/api\/annotations.proto\" rel=\"noopener\" target=\"_blank\">annotations.proto<\/a> dosyalar\u0131n\u0131 ekleyiniz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding.png\" alt=\".NET 7 - Asp.NET Core gRPC Uygulamalar\u0131nda JSON Transcoding\" width=\"185\" height=\"247\" class=\"aligncenter size-full wp-image-26050\" \/><\/a>Son olarak .proto dosyan\u0131z\u0131 a\u015fa\u011f\u0131daki gibi HTTP konseptine uygun bir \u015fekilde g\u00fcncelleyiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nsyntax = &quot;proto3&quot;;\r\n\r\noption csharp_namespace = &quot;gRPC_Server&quot;;\r\n\r\nimport &quot;google\/api\/annotations.proto&quot;;\r\n\r\npackage message;\r\n\r\nservice Message {\r\n  rpc SendMessage (MessageRequest) returns (stream MessageReply){\r\n    option (google.api.http) = {\r\n      get: &quot;\/message\/{text}&quot;\r\n    };\r\n  };\r\n}\r\n\r\nmessage MessageRequest {\r\n  string text = 1;\r\n}\r\n\r\nmessage MessageReply {\r\n  string text = 1;\r\n}\r\n<\/pre>\n<\/div>\n<p>Burada <strong>5.<\/strong> sat\u0131ra bakarsan\u0131z <code>google\/api\/annotations.proto<\/code> path&#8217;indeki dosya import edilmekte ve <strong>11<\/strong> ile <strong>13.<\/strong> sat\u0131r aral\u0131\u011f\u0131nda &#8216;SendMessage&#8217; fonksiyonunun HTTP protokol\u00fc \u00fczerinden <code>\/message\/<span style=\"color:red;\">{text}<\/span><\/code> endpoint&#8217;i e\u015fli\u011finde &#8216;GET&#8217; t\u00fcr\u00fcnden tetiklenebilece\u011fi bildirilmektedir. Buradaki <span style=\"color:red;\">{text}<\/span> parametresi ise, tetikleme s\u00fcrecinde ilgili fonksiyonun ald\u0131\u011f\u0131 &#8216;MessageRequest&#8217; nesnesinin &#8216;text&#8217; field&#8217;\u0131na kar\u015f\u0131l\u0131k gelmektedir.<\/p>\n<p>B\u00f6ylece &#8216;SendMessage&#8217; metodu art\u0131k hem gRPC hem de JSON Web API olarak \u00e7a\u011fr\u0131labilecek \u015fekilde tasarlanm\u0131\u015ft\u0131r. Misal olarak taray\u0131c\u0131 \u00fczerinden ilgili endpoint&#8217;e bir istek g\u00f6nderdi\u011fimizde cevap olarak a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcndeki de\u011feri elde ediyor olaca\u011f\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-1.png\" alt=\".NET 7 - Asp.NET Core gRPC Uygulamalar\u0131nda JSON Transcoding\" width=\"348\" height=\"172\" class=\"aligncenter size-full wp-image-26052\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-1.png 348w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-1-300x148.png 300w\" sizes=\"auto, (max-width: 348px) 100vw, 348px\" \/><\/a><\/p>\n<p>gRPC JSON Transcoding&#8217;i GET isteklerinin d\u0131\u015f\u0131nda a\u015fa\u011f\u0131daki HTTP metotlar\u0131n\u0131n hepsiyle de kullanabilmekteyiz.<\/p>\n<ul>\n<li>GET<\/li>\n<li>POST<\/li>\n<li>PUT<\/li>\n<li>DELETE<\/li>\n<li>PATCH<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin, POST iste\u011fini kar\u015f\u0131layabilecek bir metodu a\u015fa\u011f\u0131daki gibi tasarlayabiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nsyntax = &quot;proto3&quot;;\r\n\r\noption csharp_namespace = &quot;gRPC_Server&quot;;\r\n\r\nimport &quot;google\/api\/annotations.proto&quot;;\r\n\r\npackage person;\r\n\r\nservice Person {\r\n  rpc CreatePerson (PersonRequest) returns (PersonResponse){\r\n    option (google.api.http) = {\r\n      post: &quot;\/persons&quot;,\r\n      body : &quot;*&quot;\r\n    };\r\n  };\r\n}\r\nmessage PersonRequest {\r\n  string name = 1;\r\n  string surname = 2;\r\n}\r\n\r\nmessage PersonResponse {\r\n  string message = 1;\r\n}\r\n<\/pre>\n<\/div>\n<h4>gRPC JSON Transcoding | Swagger<\/h4>\n<p>Ayr\u0131ca yap\u0131lan t\u00fcm bu konfig\u00fcrasyonlar\u0131 Swashbuckle ile entegre ederek gRPC&#8217;yi Swagger aray\u00fcz\u00fc \u00fczerinden de test edebiliriz. Bunun i\u00e7in server uygulamas\u0131na <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Grpc.Swagger\" rel=\"noopener\" target=\"_blank\">Microsoft.AspNetCore.Grpc.Swagger<\/a> k\u00fct\u00fcphanesini y\u00fckleyiniz ve &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki yap\u0131land\u0131rmay\u0131 ger\u00e7ekle\u015ftiriniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing gRPC_Server.Services;\r\nusing Microsoft.OpenApi.Models;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddCors(options =&gt; options.AddDefaultPolicy(policy =&gt; policy.AllowAnyMethod()\r\n                                                                             .AllowAnyHeader()\r\n                                                                             .AllowAnyOrigin()));\r\n\r\nbuilder.Services.AddGrpc()\r\n    .AddJsonTranscoding();\r\n\r\nbuilder.Services.AddGrpcSwagger();\r\nbuilder.Services.AddSwaggerGen(options =&gt;\r\n                               options.SwaggerDoc(&quot;v1&quot;, new OpenApiInfo\r\n                               {\r\n                                   Title = &quot;gRPC Transcoding&quot;,\r\n                                   Version = &quot;v1&quot;\r\n                               }));\r\n\r\nvar app = builder.Build();\r\napp.UseCors();\r\n\r\napp.UseSwagger();\r\napp.UseSwaggerUI(options =&gt; options.SwaggerEndpoint(&quot;\/swagger\/v1\/swagger.json&quot;, &quot;My API V1&quot;));\r\n\r\napp.MapGrpcService&lt;MessageService&gt;();\r\napp.MapGrpcService&lt;PersonService&gt;();\r\napp.MapGet(&quot;\/&quot;, () =&gt; &quot;&quot;);\r\n\r\napp.Run();\r\n\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer Swagger i\u00e7in <strong>12<\/strong> ile <strong>13.<\/strong> sat\u0131rlardaki gibi uygulamaya gerekli servislerin eklenmesi ve devam\u0131nda ise <strong>23<\/strong> ile <strong>24.<\/strong> sat\u0131rlardaki gibi middleware&#8217;lerin \u00e7a\u011fr\u0131lmas\u0131 yeterli olacakt\u0131r.<\/p>\n<p>Bunun d\u0131\u015f\u0131nda .proto dosyas\u0131nda a\u015fa\u011f\u0131daki gibi yorum sat\u0131rlar\u0131ndan da a\u00e7\u0131klama sat\u0131rlar\u0131 olu\u015fturulabilir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n\/\/Person service\r\nservice Person {\r\n    \/\/Person creater service\r\n  rpc CreatePerson (PersonRequest) returns (PersonResponse){\r\n    option (google.api.http) = {\r\n      post: &quot;\/persons&quot;,\r\n      body : &quot;*&quot;\r\n    };\r\n  };\r\n}\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Tabi yorum sat\u0131rlar\u0131n\u0131 a\u00e7\u0131klama sat\u0131r\u0131 olarak okuyabilmek i\u00e7in server uygulamas\u0131n\u0131n <code>.csproj<\/code> dosyas\u0131nda <code style=\"color:red;font-size:12px;\">&lt;GenerateDocumentationFile&gt;<span style=\"color:blue;\">true<\/span>&lt;\/GenerateDocumentationFile&gt;<\/code> komutu ile gerekli etkinle\u015ftirmenin yap\u0131lmas\u0131 ve ard\u0131ndan yine &#8216;Program.cs&#8217; dosyas\u0131nda <code>AddSwaggerGen<\/code> metodunda a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131rman\u0131n in\u015fas\u0131 gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nbuilder.Services.AddSwaggerGen(options =&gt;\r\n{\r\n    options.SwaggerDoc(&quot;v1&quot;, new OpenApiInfo\r\n    {\r\n        Title = &quot;gRPC Transcoding&quot;,\r\n        Version = &quot;v1&quot;\r\n    });\r\n\r\n    var filePath = Path.Combine(System.AppContext.BaseDirectory, &quot;gRPC_Server.xml&quot;);\r\n    options.IncludeXmlComments(filePath);\r\n    options.IncludeGrpcXmlComments(filePath, includeControllerXmlComments: true);\r\n});\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Nihai olarak ilgili servisi aya\u011fa kald\u0131rd\u0131\u011f\u0131m\u0131zda Swagger aray\u00fcz\u00fcn\u00fc a\u015fa\u011f\u0131daki gibi g\u00f6rebiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-2.png\" alt=\".NET 7 - Asp.NET Core gRPC Uygulamalar\u0131nda JSON Transcoding\" width=\"538\" height=\"509\" class=\"aligncenter size-full wp-image-26060\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-2.png 538w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/12\/NET-7-Asp.NET-Core-gRPC-Uygulamalarinda-JSON-Transcoding-2-300x284.png 300w\" sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><\/a><\/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<p>Not : \u00d6rnek uygulamay\u0131 a\u015fa\u011f\u0131daki github adresinden inceleyebilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/gRPC_Json_Transcoding_Example\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/gRPC_Json_Transcoding_Example<\/a><\/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, Bu i\u00e7eri\u011fimizde gRPC teknolojisini REST API olarak kullanmam\u0131z\u0131 sa\u011flayacak olan .NET 7 ile gelen JSON Transcoding \u00f6zelli\u011fini t\u00fcm teferruatlar\u0131yla birlikte de\u011ferlendiriyor olaca\u011f\u0131z. gRPC, bilindi\u011fi \u00fczere y\u00fcksek performansl\u0131(high-performance) ve ger\u00e7ek zamanl\u0131(real-time) servisler \u00fcretmemizi sa\u011flayan,&#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":20414,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4754,4032],"tags":[4327,4751,4065,4750,4753,4749,4752,3765,3764],"class_list":["post-26041","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-7","category-grpc","tag-asp-net-core-grpc","tag-asp-net-core-grpc-json-transcoding","tag-grpc","tag-grpc-json-transcoding","tag-grpc-swashbuckle","tag-json-transcoding","tag-microsoft-aspnetcore-grpc-jsontranscoding","tag-remote-procedure-call","tag-rpc"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26041","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=26041"}],"version-history":[{"count":14,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26041\/revisions"}],"predecessor-version":[{"id":26061,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26041\/revisions\/26061"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/20414"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=26041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}