如何使ASP Web API中返回的属性可配置?

时间:2013-07-17 16:38:18

标签: api asp.net-web-api json.net

多个RESTful API通常通过查询字符串参数(例如stackexchange的过滤器参数)为调用者返回的数据量提供选项。

我想至少为返回的数据提供一定程度的可配置性,可能不一定达到相同的灵活性水平(虽然我没有反对它)但是到了具有单独视图模型的程度不是一个可行的解决方案。

然而,我很难在Web API中找到一个好点来添加某种属性白/黑名单。这样做的恰当方法是什么?

1 个答案:

答案 0 :(得分:1)

使用单个DTO返回字段子集的一种方法是在DTO中为可选属性设置可为空的类型。

[DataContract]
public class Dude
{
    [DataMember]
    public int Id { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public string FirstName { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public string MiddleName { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public string LastName { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public int? IQ { get; set; }
}

您需要获取客户有兴趣在响应中看到的字段列表,并在您返回的DTO实例中填充仅限那些,如下所示。

return new Dude() { Id = 123, FirstName = "Johnny" };

这会发送一个类似{ "Id":123, "FirstName":"Johnny" }的JSON。当其他客户要求说LastName时,您将返回new Dude() { Id = 123, LastName = "Bravo" };,JSON将为{ "Id":123, "LastName":"Bravo" }

这适用于XML和JSON。如果您只使用JSON,则无需应用属性。只需要指示JSON.NET忽略空值。

config.Formatters.JsonFormatter.SerializerSettings =
        new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore
        };

如何获取字段列表的最后一部分将取决于您的API设计。您也许可以使用操作过滤器从请求中获取这些标准字段,并使用它来从持久性存储中获取数据。