关于Api返回内容形式的一点思考
通常在写表单信息的展示接口时,会有这样的结构出现
{
"code": 10000,
"message": "操作成功",
"time": "2021/5/18 17:16:16",
"result": {
"name": "111",
"phone": "11111",
"id_c_no": "11111",
"id_type": "身份证",
"birthday": "2021年4月14日",
"email": "11111111@qq.com",
"mail_pro": "上海市徐汇区",
"mail_add": "上海市徐汇区天钥桥路路220号",
"mail_re": "田蕾",
"mail_re_phone": "11223344"
}
}
这样写的缺点在于前端也必须建立模型进行接收,如果要增加新的展示信息,那么前后端都得同步修改。
如果想让前端不动代码的情况下,后端在以上结构基础上,实现后端增加数据,而前端无需改动代码的结构。按照这个思路,就需要写一个集合的方式将写死的key值变成value,通过循环加载原来的name以及name对应的值,基于这个思路json格式改为一下内容:
{ "code": 10000, "message": "操作成功", "time": "2021/6/1 10:51:44", "result": { "data": [ { "name": "姓名", "keys": "name", "values": "xxxxx" }, { "name": "手机号", "keys": "phone", "values": "1871111111" }, { "name": "身份证", "keys": "id_c_no", "values": "1" }, { "name": "证件类型", "keys": "id_type", "values": "身份证" }, { "name": "生日", "keys": "birthday", "values": "2021年5月29日" }, { "name": "邮箱", "keys": "email", "values": "402" }, { "name": "邮寄省份", "keys": "mail_pro", "values": "陕西省-西安市-雁塔区" }, { "name": "邮寄地址", "keys": "mail_add", "values": "大寨路" }, { "name": "收件人", "keys": "mail_r", "values": "xxxx" }, { "name": "收件人电话", "keys": "mail_r_phone", "values": "18" } ] } }
有了思路就动手实现,过程中用到的知识点:
1、C#的反射机制,通过反射获取类属性集合,循环获取Name及Value值
2、在类属性上定义DisplayAttribute属性,再通过方法获取Dispaly里定义的Name值,引用的命名空间:using System.ComponentModel.DataAnnotations;
public class BaseInfoOutput { [Display(Name = "姓名")] public string name { get; set; } }
//根据PropertyInfo 获取Display上定义的Name的值
public static string GetDisplayName(this PropertyInfo property) { string displayName = property.GetTypeCustomValue<DisplayAttribute>(x => new { x.Name }); if (string.IsNullOrEmpty(displayName)) { return property.Name; } return displayName; }
这样就能获取name,keys以及values三个关键信息,想要的结果集也出来了。
需要注意的问题:
对于一般的展示信息来说,values的类型string就够用了,但是如果values是集合,在给values赋值时需要转原来的对象集合转为json串,string就没办法很好的展示数据。 所以定义values的类型时建议写为object
当然以上都是基于简单类型,如果再配合前端的控件样式、输入验证规则等内容,实现起来会更复杂一些,一种思路是可在数据库单独定义表单控件样式表,将表单的验证及展示形式信息页塞入到返回集合中