Passar múltiplos parâmetros para um método GET em C# é um requisito comum no desenvolvimento de APIs web. Este artigo explora várias técnicas para alcançar isso dentro do ASP.NET Core, focando em clareza, manutenibilidade e melhores práticas.
Sumário
- Passando Parâmetros via Roteamento Convencional
- Usando Roteamento por Atributos e [FromQuery]
- Lidando com Parâmetros Opcionais
- Aproveitando o Binding de Modelo
- Tratamento Robusto de Erros
Passando Parâmetros via Roteamento Convencional
O roteamento convencional incorpora diretamente os parâmetros no caminho da URL. Esta abordagem é adequada para um pequeno número de parâmetros que identificam diretamente um recurso.
Exemplo: Recuperando um produto com base em seu ID e ID de categoria.
URL: /products/123/category/456
using Microsoft.AspNetCore.Mvc;
public class ProductsController : Controller
{
public IActionResult GetProduct(int productId, int categoryId)
{
// Processa productId e categoryId
return Ok($"Product ID: {productId}, Category ID: {categoryId}");
}
}
Limitações: As URLs tornam-se menos legíveis e manuteníveis à medida que o número de parâmetros aumenta. É menos flexível para parâmetros opcionais.
Usando Roteamento por Atributos e [FromQuery]
O roteamento por atributos fornece maior controle sobre a estrutura da URL. Usando [FromQuery]
, os parâmetros são extraídos da string de consulta, tornando as URLs mais limpas e gerenciáveis, mesmo com vários parâmetros.
Exemplo: O mesmo exemplo de recuperação de produto, mas usando roteamento por atributos e [FromQuery]
.
URL: /products?productId=123&categoryId=456
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet]
public IActionResult GetProduct([FromQuery] int productId, [FromQuery] int categoryId)
{
return Ok($"Product ID: {productId}, Category ID: {categoryId}");
}
}
Este método promove melhor organização e legibilidade da URL. O atributo [ApiController]
permite a validação automática de modelos e o tratamento de respostas.
Lidando com Parâmetros Opcionais
Parâmetros opcionais melhoram a flexibilidade. Use valores padrão na assinatura da ação do controlador.
[HttpGet]
public IActionResult GetProduct([FromQuery] int productId, [FromQuery] int categoryId, [FromQuery] int pageSize = 10)
{
return Ok($"Product ID: {productId}, Category ID: {categoryId}, Page Size: {pageSize}");
}
Aqui, pageSize
assume o valor padrão 10 se não fornecido na string de consulta.
Aproveitando o Binding de Modelo
Para múltiplos parâmetros, considere criar um modelo dedicado. Isso melhora a organização e a manutenibilidade do código. O ASP.NET Core vinculará automaticamente a string de consulta às propriedades do modelo.
public class ProductFilter
{
public int ProductId { get; set; }
public int CategoryId { get; set; }
public int PageSize { get; set; } = 10;
}
[HttpGet]
public IActionResult GetProduct(ProductFilter filter)
{
return Ok($"Product ID: {filter.ProductId}, Category ID: {filter.CategoryId}, Page Size: {filter.PageSize}");
}
Tratamento Robusto de Erros
Sempre trate erros potenciais, como parâmetros obrigatórios ausentes ou tipos de dados inválidos. Use técnicas como validação de modelo ou verificações explícitas de parâmetros para lidar com essas situações de forma elegante.
[HttpGet]
public IActionResult GetProduct(ProductFilter filter)
{
if (filter.ProductId == 0)
{
return BadRequest("Product ID is required.");
}
// ... resto da sua lógica ...
}