Action Metot Nedir?
Merhaba, bu yazımda sizlerle Action metotlar hakkında konuşmak istedim ve bildiklerimi aktardım. Umarım faydalı olur :)
Yapıları itibariyle normal metot tanımından bir farkları yoktur. Http request’leri karşılayıp, servis içerisinde gerekli işlemler tamamlandıktan sonra http response’ları geri döndüren metotlardır. Bu action metotlarda isteği karşılamak ve parametre geçebilmek için kullanılan FromRoute, FromQuery, FromBody ve FromService gibi bazı attributelar mevcuttur.
- Metotlara parametre vermenin birden fazla yolu vardır;
- FromRoute: API metodu içindeki bir parametreye URL’deki yönlendirme parametrelerini bağlamak için ve Endpoint url’i içerisinde gönderilen parametreleri okumak için kullanılır. Aynı zamanda yaygın olarak resource’a ait id bilgisi okurken kullanılır. Yönlendirme parametreleri, URL’nin belirli bir bölümünde belirtilen dinamik değerlerdir. Örneğin, “https://example.com/api/products/{id}” gibi bir URL'de "id" yönlendirme parametresi bulunmaktadır. FromRoute yöntemi, bu yönlendirme parametresini bir API metodu içindeki bir parametreye bağlamak için kullanılır. Yaygın olarak resource'a ait id bilgisi okurken kullanılır.
FromRoute mantığı: Route da çalışırken eksiksiz ve hatasız göndermeliyiz ki çalışsın. Genelde Sadece primary key yada primitive değerlerde kullanılır.
GetById için Route diğer filtreler için query kullanımı önerilir.
[HttpGet("{id}/{name}/{lastname}")] //Buradaki isimlerin parametre kısmındakilerle aynı olması zorunlu değil ama queryde zorunlu
//Route da url de parametreler var ama queryde yok
public string GetByIdParamenterRoute([FromRoute] int? id, [FromRoute] string? name, [FromRoute] string? lastname) //parametre alıp string dönüyor.
{ //Route da nullable olması bir şey ifade etmiyor, parametre değeri girilmezse nullable olsa bile çalışmaz
//Route'dan çalışıyor
return $"id={id}||name={name}||lastname={lastname}";
}
// Default olarak FromRoute
[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id)
{
}
// El ile FromRoute verme
[HttpGet("{id}")]
public async Task<IActionResult> GetById([FromRoute]int id)
{
}
2) FromQuery: FromQuery url içerisinde gönderilen parametreyi okumamıza yarar. endpoint isimlerini de istediğimiz şekilde belirleyebiliriz. Aşağıda gördüğümüz FromQuery örneğinde örnek URL şu şekilde olacaktır;
“http://localhost:5251/api/Products/GetById?=1″
Burada [HttpGet(“{getbyId}”)] içerisine dilediğimiz tanımlamayı verebiliriz.
FromQuerynin mantığı: Url i ne kadar bozarsak bozalım, parametreler ve query ne kadar bozulursa bozulsun çalışmaya devam eder. Query esneklik sağlıyor.
[HttpGet] //Http metot'unun tipini belirtir
//? --> nullable yani null olabilir demek bu olmazsa parametrelere değer girmediğimizde hata verir ve çalışmaz
public string GetByIdParamenterQuery([FromQuery] int? id, [FromQuery] string? name, [FromQuery] string? lastname)
{
//Query ile çalışıyor
// String ifade dönüyor
return $"id={id}||name={name}||lastname={lastname}"; //string birleştirme işlemi(String Interpolation)
}
[HttpGet("{getbyId}")]
public async Task<IActionResult> GetById([FromQuery]int id)
{
}
3) FromBody: Http request inin body’si içerisinde gönderilen parametreleri okumak için kullanılır. Bir method HttpPost ve HttpPut ise default olarak FromBody dir. Default olarak gelen FromBody i manipüle etmek mümkündür. Post işleminde AddProduct([FromBody]Product product) içerisinde [FromBody] yi vermesek dahi default olarak FromBody şeklinde olacaktır.
FromBody işlemini örnek olarak FromQuery şeklinde manipüle edecek olursak burada örnek olarak gelecek URL aşağıdaki gibi olacaktır ve değerleri parametre olarak alıyor olacağız ;
“http://localhost:5251/api/Products?=1&name=iPhone&”
Fakat bu yöntem best practice lere aykırıdır.
[HttpPost]
public async Task<IActionResult> AddProduct([FromBody]Product product)
{
}
//Manipüle edilmiş hali
[HttpPost]
public async Task<IActionResult> AddProduct([FromQuery]Product product)
{
}
4) FromService: .Net Core da dependency injection yapmaya yarayan bir attribute’dur. Normalde constructor üzerinden geçtiğimiz DI ları FromService ile sadece ilgili ActionMetot üzerinden de geçebiliriz.
Aşağıdaki örnekte constructor üzerinden değil de doğrudan ilgili action method üzerinden FromService aracılığı ile geçilmiş bir DI örneğini görebiliriz.
[HttpDelete("{id}")]
public async Task<IActionResult> Delete ([FromServices] IProductRepository repository, int id)
{
}