我有一个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
,但不需要,则可以获得奖励积分。
答案 0 :(得分:2)
这是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":"史蒂夫"}
我现在没有办法测试它[我在vanilla Web API上有类似的东西,有大量可选字段],但是通过.NET Core docs 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包。
答案 1 :(得分:1)
您可以使用conditional serialization。您只需将ShouldSerialize返回值基于fields参数是否包含标识该字段的字符串。这适用于您想要与字段关联的任何字符串。如果需要,您甚至可以为每个字段接受多个字符串。
要将fieldList放入要序列化的对象(Person)中,您只需将它或包含它的内容(HttpRequest.Query或某些自定义Options类)传递给构造函数即可。
public bool ShouldSerializeFirstName(){
return fieldList.Contains("FirstName");
}