آموزش استفاده از گوگل پروتو بافر به جای json در asp.net core web api
سلام دوستان
در این مقاله قصد داریم به جای ارسال json در پاسخ web api از گوگل پروتو بافر استفاده کنیم که سریع تر و قدرتمند تر است
اول از همه باید یک پروژه از نوع asp.net core web api ایجاد کنید
در مرحله بعد باید کتاب خانه WebApiContrib.Core.Formatter.Protobuf را نصب کنید
در مرحله بعد یک کلاس با نام item ایجاد می کنیم تا نقش مدل دیتابیس را بازی کند
asp.net core پروتو باف فورمتر
[ProtoContract]
public class Item
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public long Value { get; set; }
}
توجه کنید باید فضای نام
using ProtoBuf;
را یوزینگ کنید
در مرحله بعد کلاس startup را باز کنید و به صورت زیر تغییر دهید
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddProtobufFormatters();
}
یک کنترلر با نام ItemController بسازید و به صورت زیر یک اکشن get به آن اضافه کنید
[Route("api/[controller]")]
[Produces("application/x-protobuf")]
[ApiController]
public class ItemController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
List<Item> items = new List<Item>
{
new Item{Id=1, Name= "Item 1", Value=4},
new Item{Id=2, Name= "Item 2", Value=3 }
};
return Ok(items);
}
}
در حالت عادی متد بالا یک json برمی گرداند اما ما قصد داریم protobuf بر گردانیم به همین دلیل صفت زیر را اضافه کردیم
[Produces("application/x-protobuf")]
حالا api ما به اتمام رسید
حال باید یک کلاینت برای پروژه خود ایجاد کنیم
برای اینکار یک console application ایجاد کنید
ما کلاینت خود را به دو روش ایجاد می کنیم
روش اول استفاده از restsharp
برای این کار اول از همه کتاب خانه RestSharp را نصب کنید
بر اساس پروژه خود که ممکن است dotnet core و یا dotnet framework باشد یکی از پکیج های زیر را نصب کنید
protobuf-net
protobuf-net.Core
و از کد زیر استفاده کنید
class Program
{
static void Main(string[] args)
{
RestClient client = new RestClient("http://localhost:2179/");
client.AddDefaultHeader("Content-Type", "application/x-protobuf");
RestRequest request = new RestRequest("api/item", Method.GET);
var response = client.Execute(request);
using (var stream = new MemoryStream(response.RawBytes))
{
var items = Serializer.Deserialize<List<Item>>(stream);
foreach(Item item in items)
Console.WriteLine($"{item.Name}");
}
Console.ReadLine();
}
}
توجه کنید باید اول پروژه web api را اجرا کنید و به جای http://localhost:2179/ ادرس wep api خود را بنویسید
در روش دوم از WebClient استفاده می کنیم
به یاد داشته باشید باید برای deserialize کردن پروتو بافر در این حالت باید کتاب خانه زیر را نصب کنید
WebApiContrib.Formatting.ProtoBuf
و از کد زیر استفاده کنید
class Program
{
static void Main(string[] args)
{
var client = new HttpClient { BaseAddress = new Uri("http://localhost:2179/") };
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-protobuf"));
HttpResponseMessage response = client.GetAsync("api/item").Result;
if (response.IsSuccessStatusCode)
{
List<Item> items = response.Content.ReadAsAsync<List<Item>>(new[] { new ProtoBufFormatter() }).Result;
foreach (Item item in items)
Console.WriteLine($"{item.Name}");
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
}
}
پایان.