我有一个 WebAPI 服务,我想允许用户指定他们想要返回的字段。例如,假设我有以下 Person 类:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
并且调用 /api/people/ 返回所有人的所有三个字段。我如何处理像 /api/people?fields=FirstName,Email 这样的请求,只为所有人返回这两个字段?如果我可以将诸如 first_name 之类的内容映射到 FirstName ,则可加分,但这不是必需的。
请您参考如下方法:
这是 Dynamic Language Runtime 的工作特别是 ExpandoObject ,由此您只返回您需要的属性在运行时确定:
public dynamic GetPerson()
{
bool firstNameRequired = true; // TODO: Parse querystring
bool lastNameRequired = false; // TODO: Parse querystring
dynamic rtn = new ExpandoObject();
if (firstNameRequired)
rtn.first_name = "Steve";
if (lastNameRequired)
rtn.last_name = "Jobs";
// ... and so on
return rtn;
}
void Main()
{
// Using the serializer of your choice:
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(GetPerson()));
}
输出:
{"first_name":"Steve"}
我现在没有办法测试它 [我在 vanilla Web API 的生产中有类似的东西,有大量的可选字段],但是根据 .NET Core 文档,web 方法看起来有点像就像这样,尽管没有硬编码值!:
[HttpGet()]
public IActionResult Get([FromQuery(Name = "fields")] string fields)
{
var fieldsOptions = fields.Split(',');
dynamic rtn = new ExpandoObject();
if (fieldsOptions.Contains("FirstName"))
rtn.first_name = "Steve";
if (fieldsOptions.Contains("LastName"))
rtn.last_name = "Jobs";
if (fieldsOptions.Contains("Email"))
rtn.email = "steve@apple.com";
return new ObjectResult(rtn);
}
您需要引用 System.Dynamic.Runtime包。
