Web API 多个属性的 HTTPGet?
Web API HTTPGet for multiple attributes?
我们有一个用 DotNet Core 3.1.402 编写的 Web API(我是 DotNet Core 和 WebAPI 的新手)。
我们使用 SqlKata 进行数据库处理。
我们有一个包含 AccountID、AccountName、AccountNumber 等的帐户模型
我们想通过不同的属性获取一个帐户,例如:通过 AccountID、通过 AccountName、通过 AccountNumber。
我们如何才能做到这一点,这样我们就不需要为每个属性使用单独的 HttpGet(这样我们就不必为不同的属性重复相同的代码)?
这是我们在AccountsController中的HttpGet通过AccountID获取账户
public class AccountsController : ControllerBase
{
private readonly IAccountRepository _accountRepository;
[HttpGet("{AccountID}")]
public Account GetAccount(int AccountID)
{
var result = _accountRepository.GetAccount(AccountID);
return result;
}
这是AccountRepository.cs
中的代码
public Account GetAccount(int accountID)
{
var result = _db.Query("MyAccountTable").Where("AccountID", accountID).FirstOrDefault<Account>();
return result;
}
这是帐户class
namespace MyApi.Models
{
public class Account
{
public string AccountID { get; set; }
public string AccountName { get; set; }
public string AccountNumber { get; set; }
// other attributes
}
}
谢谢。
用 GET 做这件事可能会很痛苦,有一些方法可以传递 path/query 数组和复杂的对象但是很难看,你能做的最好的就是使用 POST 而不是 GET并传递一个包含您想要的过滤器的对象。
//In the controller...
[HttpPost]
public Account GetAccount([FromBody]Filter[] DesiredFilters)
{
var result = _accountRepository.GetAccount(DesiredFilters);
return result;
}
//Somewhere else, in a shared model...
public class Filter
{
public string PropertyName { get; set; }
public string Value { get; set; }
}
//In the repository...
public Account GetAccount(Filter[] Filters)
{
var query = _db.Query("MyAccountTable");
foreach(var filter in Filters)
query = query.Where(filter.PropertyName, filter.Value);
return query.FirstOrDefault<Account>();
}
现在您可以在请求正文中发送一个 JSON 数组,其中包含您想要的任何过滤器,例如:
[
{ "PropertyName": "AccountID", "Value": "3" },
{ "PropertyName": "AccountName", "Value": "Whatever" }
]
我们有一个用 DotNet Core 3.1.402 编写的 Web API(我是 DotNet Core 和 WebAPI 的新手)。
我们使用 SqlKata 进行数据库处理。
我们有一个包含 AccountID、AccountName、AccountNumber 等的帐户模型
我们想通过不同的属性获取一个帐户,例如:通过 AccountID、通过 AccountName、通过 AccountNumber。
我们如何才能做到这一点,这样我们就不需要为每个属性使用单独的 HttpGet(这样我们就不必为不同的属性重复相同的代码)?
这是我们在AccountsController中的HttpGet通过AccountID获取账户
public class AccountsController : ControllerBase
{
private readonly IAccountRepository _accountRepository;
[HttpGet("{AccountID}")]
public Account GetAccount(int AccountID)
{
var result = _accountRepository.GetAccount(AccountID);
return result;
}
这是AccountRepository.cs
中的代码public Account GetAccount(int accountID)
{
var result = _db.Query("MyAccountTable").Where("AccountID", accountID).FirstOrDefault<Account>();
return result;
}
这是帐户class
namespace MyApi.Models
{
public class Account
{
public string AccountID { get; set; }
public string AccountName { get; set; }
public string AccountNumber { get; set; }
// other attributes
}
}
谢谢。
用 GET 做这件事可能会很痛苦,有一些方法可以传递 path/query 数组和复杂的对象但是很难看,你能做的最好的就是使用 POST 而不是 GET并传递一个包含您想要的过滤器的对象。
//In the controller...
[HttpPost]
public Account GetAccount([FromBody]Filter[] DesiredFilters)
{
var result = _accountRepository.GetAccount(DesiredFilters);
return result;
}
//Somewhere else, in a shared model...
public class Filter
{
public string PropertyName { get; set; }
public string Value { get; set; }
}
//In the repository...
public Account GetAccount(Filter[] Filters)
{
var query = _db.Query("MyAccountTable");
foreach(var filter in Filters)
query = query.Where(filter.PropertyName, filter.Value);
return query.FirstOrDefault<Account>();
}
现在您可以在请求正文中发送一个 JSON 数组,其中包含您想要的任何过滤器,例如:
[
{ "PropertyName": "AccountID", "Value": "3" },
{ "PropertyName": "AccountName", "Value": "Whatever" }
]