.Net Core Web API – Custom Header

21 Ara

Herkese merhaba,
Bugün sizlere Asp.Net Core Web API‘sinde Header alanına nasıl kendi istediğimiz özel alanları ekleriz anlatacağım.

Öncelikle, bilmeyenler için kısaca Header nesnesinden bahsetmek isterim. Header nesnesi için şöyle bir tanım yapabiliriz: Web dünyasında, herhangi bir yere istekte bulunduğunuz zaman web sitesi ya da web api fark etmeksizin her durum için client olarak servera belli başlı bilgiler otomatik ya da manuel olarak gönderilir/doldurulur. Örnek olarak tarayıcınızda yeni sekme açıp, F12 tuşunu basıp Ağ/Network bölümünü açalım, URL kısmına herhangi bir web sitesi yazıp entera basalım mesela https://semihcelikol.com yazalım. Get kısımlarından ilgili siteye tıkladığınızda Header içinde tarayıcınız tarafından otomatik gönderilen değerleri görebilirsiniz.

Buradaki bilgiler tarayıcınız tarafından otomatik olarak gönderilmiş durumda. WEB API‘de buraları elle dolduruyoruz. Örneğin isteği Postman‘den atıyorsanız o da sizin yerinize otomatik olarak buradaki Header bilgilerini dolduruyor. Ben de bugün bir Asp.Net Core Web API projesinde, buraya nasıl özel bir alan ekleyebiliriz göstereceğim.

1- Boş bir Asp.Net Core Web API projesi açtım.
2- Header alanına bir alan eklemek için IOperationFilter isimli bir interfaceten yararlanıyoruz. Bunun için IOperationFilter‘dan türeyen CustomHeaderFilter isili class ekledim.
Visual Studio hemen bize gerekli methodları implement etmemiz için öneri çıkartıyor.

Apply Methodunu classımıza implement edelim ve aşağıdaki hale getirelim.
Ben özel bir alan eklediğimi daha net görebilmek için x-companyId isimli bir alan ekledim. Tipini de string yaptım.

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace AspNetCore_CustomHeader
{
    public class CustomHeaderFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            if (operation == null)
            {
                operation.Parameters = new List<OpenApiParameter>();
            }

            operation.Parameters.Add(new OpenApiParameter
            {
                Name = "x-companyId",
                In = ParameterLocation.Header,
                Required = true,
                Schema = new OpenApiSchema
                {
                    Type = "string"
                }
            });
        }
    }
}

3- Şimdi sıra geldi CustomHeaderFilter classımızı init ettirmeye. Projemiz oluşurken otomatik olarak bu filtreye göre çalışmasını API’mize anlatmamız lazım. Bunun için, Program.cs içinde services kısmımıza bu kodu ekleyelim.

builder.Services.AddSwaggerGen(x => x.OperationFilter<CustomHeaderFilter>());

Eğer .Net 7 değil de daha alt bir versiyon kullanıyorsanız, bu işlemi Startup.cs dosyası içinde yapabilirsiniz. Sanırım .Net 6’dan itibaren Startup.cs kalktı. Hepsi Program.cs içerisine toplandı.

Program.cs tam kodlar

namespace AspNetCore_CustomHeader
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen(x => x.OperationFilter<CustomHeaderFilter>());

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

4- Evet filtreleme işlemi tamamlandı. Projeyi çalıştırdığımız zaman swagger toolunda bu alanın zorunlu olarak doldurulması gerektiğini görebiliriz.

5- Peki burada girilen değeri, controller tarafında nasıl alıp kullanacağız. Gelin şimdi ona bakalım.
HttpContext içinden bu Header objelerini çekebiliyoruz.

string headerCompanyId = HttpContext.Request.Headers["x-companyId"].ToString();

Ben sıfırdan proje açtığım için otomatik olarak gelen WeatherForecastController classının Get methodu içerisini şu şekilde düzenledim.

using Microsoft.AspNetCore.Mvc;

namespace AspNetCore_CustomHeader.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public ActionResult Get()
        {
            string headerCompanyId = HttpContext.Request.Headers["x-companyId"].ToString();

            if (string.IsNullOrEmpty(headerCompanyId))
            {
                return StatusCode((int)System.Net.HttpStatusCode.InternalServerError, "Header bilgisinde x-companyId gönderilmelidir");
            }

            return Ok(Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray());
        }
    }
}

Get methodunda, eğer x-companyId alanım boş ise hata verip dönüyorum. Bu işlemi test edebilmem için 3. party bir araca ihtiyacımız var. Bunun için ben Postman‘den yararlandım. Projeyi çalıştırıp ilk önce x-companyId olmadan istek attım ve hatayı aldığımı gördüm.

Sonrasında x-companyId alanını ekleyip gönderiyorum ve bu sefer hata almadan cevabı görebiliyorum.

Evet işlemler bu kadar.
Yazının başında, tarayıcı tarafında istekleri takip edip, header nesnelerini görebildiğimizi söylemiştim. Aynı örneği Swagger üzerinden tetkleyip aynı sayfada F12 geliştirme tarafını açıp Ağ/Network kısmına bakarsanız eğer orada yazdığınız değerin eklenmiş olduğunu görebilirsiniz.

Umarım yardımcı olabilmişimdir. Aklınıza takılan bir konu var ise yorumlarda yazabilirsiniz. Elimden geldiğince cevaplamaya çalışıyorum.

Herkese iyi çalışmalar dilerim

Bir Cevap Yazın