FromRoute FromQuery FromBody Nedir ?
.Net Core Web Api de kullanılan action metotlar belirli http requestleri karşılayarak belirli responselar dönen metotlardır. Bu action metotlarda isteği karşılamak ve parametre geçebilmek için kullanılan FromRoute, FromQuery, FromBody gibi bazı attributelar mevcuttur.
FromRoute Nedir ?
Aşağıda Id bazlı olarak bir Get isteğini karşılayacak controller örneğini görüyoruz. Aslında bu default olarak bir FromRoute örneğidir. Bu işlem ile yapılacak Get isteğinin örnek url si şu şekilde olacaktır :
“http://localhost:9425/api/Products/1”
Örnek 1 de oluşturulmuş [HttpGet(“{id}”)] attiribute ile .Net Core Web API biz ikinci örnekte olduğu gibi [FromRoute] ‘ u vermemiş bile olsak default olarak bunu FromRoute olarak algılamaktadır.
//.Net Core Web API default FromRoute [HttpGet("{id}")] public async Task<IActionResult> GetById(int id) { var data = await _productRepository.GetById(id); if (data == null) { return NotFound(id); } return Ok(data); } // El ile FromRoute verme [HttpGet("{id}")] public async Task<IActionResult> GetById([FromRoute]int id) { var data = await _productRepository.GetById(id); if (data == null) { return NotFound(id); } return Ok(data); }
[HttpGet("{id}")] public async Task<IActionResult> GetById(int id) { var data = await _productRepository.GetById(id); if (data == null) { return NotFound(id); } return Ok(data); }
FromQuery Nedir ?
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:9425/api/Products/GetById?=1″
Burada [HttpGet(“{getbyId}”)] içerisine dilediğimiz tanımlamayı verebiliriz.
[HttpGet("{getbyId}")] public async Task<IActionResult> GetById([FromQuery]int id) { var data = await _productRepository.GetById(id); if (data == null) { return NotFound(id); } return Ok(data); }
FromBody Nedir ?
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:9425/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) { var addedProduct = await _productRepository.AddAsync(product); return Created(string.Empty, addedProduct); } //Manipüle edilmiş hali [HttpPost] public async Task<IActionResult> AddProduct([FromQuery]Product product) { var addedProduct = await _productRepository.AddAsync(product); return Created(string.Empty, addedProduct); }
FromService Nedir ?
.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) { var checkProduct = await repository.GetById(id); if (checkProduct==null) { return NotFound(id); } await _productRepository.DeleteAsync(id); return Ok(); }