关于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

    当然以上都是基于简单类型,如果再配合前端的控件样式、输入验证规则等内容,实现起来会更复杂一些,一种思路是可在数据库单独定义表单控件样式表,将表单的验证及展示形式信息页塞入到返回集合中

原文地址:https://www.cnblogs.com/yhnet/p/14845785.html