多个RESTful API通常通过查询字符串参数(例如stackexchange的过滤器参数)为调用者返回的数据量提供选项。
我想至少为返回的数据提供一定程度的可配置性,可能不一定达到相同的灵活性水平(虽然我没有反对它)但是到了具有单独视图模型的程度不是一个可行的解决方案。
然而,我很难在Web API中找到一个好点来添加某种属性白/黑名单。这样做的恰当方法是什么?
答案 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设计。您也许可以使用操作过滤器从请求中获取这些标准字段,并使用它来从持久性存储中获取数据。