惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
aimingoo的专栏
aimingoo的专栏
腾讯CDC
WordPress大学
WordPress大学
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
Engineering at Meta
Engineering at Meta
博客园_首页
B
Blog RSS Feed
D
Docker
M
MIT News - Artificial intelligence
爱范儿
爱范儿
I
InfoQ

zodream梦想开源/个人编程日记

文件解析笔记-zodream梦想开源/个人编程日记 密码本开发笔记之读写与保存-zodream梦想开源/个人编程日记 SkiaSharp 把 pixel byte[] 转成 SKBitmap-zodream梦想开源/个人编程日记 nas 使用 Docker 安装 gogs-zodream梦想开源/个人编程日记 复制 android 手机中的文件到电脑-zodream梦想开源/个人编程日记 周报:寻找优质的周刊-zodream梦想开源/个人编程日记 开发日志:对Markdown的代码块新增引用来源支持-zodream梦想开源/个人编程日记 周报:怎么写技术类的教程文章-zodream梦想开源/个人编程日记 css display:flex 布局尺寸超出问题-zodream梦想开源/个人编程日记 周报:SEO优化的思考-zodream梦想开源/个人编程日记 Edge 浏览器不适用 Edge Image Viewer 打开图片 -zodream梦想开源/个人编程日记 SEO 学习笔记(一) 内容来源-zodream梦想开源/个人编程日记 PHP 实现双因素身份认证(2FA)-zodream梦想开源/个人编程日记 WPF MVVM 获取List 多选数据-zodream梦想开源/个人编程日记 Burp Suite 抓包-zodream梦想开源/个人编程日记 使用 indexnow 注意事项-zodream梦想开源/个人编程日记 Godot 使用字体图标 例如: Iconfont、FontAwesome-zodream梦想开源/个人编程日记 angular 15 对指定页面进行访问限制-zodream梦想开源/个人编程日记 CSS 使用 column-count 实现瀑布流出现内容分割的解决办法-zodream梦想开源/个人编程日记 input 确认按键事件在手机端不生效-zodream梦想开源/个人编程日记 C# 使用socket 进行通讯-zodream梦想开源/个人编程日记 Maui开发中Windows应用开启管理员权限-zodream梦想开源/个人编程日记 Maui 中自定义控件-zodream梦想开源/个人编程日记 angular 14 使用 ng-template 实现tree 结构显示-zodream梦想开源/个人编程日记 c# 动态安装和卸载dll-zodream梦想开源/个人编程日记 慎用 CompositionTarget.Rendering-zodream梦想开源/个人编程日记 c# 重写 c++ 程序笔记:数据初始化-zodream梦想开源/个人编程日记 源码编译 aseprite-zodream梦想开源/个人编程日记 记录一下字符串分隔split各语言之间的不同-zodream梦想开源/个人编程日记 c# Gzip解码无头内容-zodream梦想开源/个人编程日记
基于不同形式的json响应处理-zodream梦想开源/个人编程日记
zodream · 2020-09-10 · via zodream梦想开源/个人编程日记

我的json格式

普通json响应

这是普通链接响应json格式,不论是否出错,响应状态码都是 200

{
    "code": 200, // 200 表示程序处理成功,其他数字自定义
    "status": "success", // success 表示成功 failure 表示失败
    "message": "",      // 成功的消息提示
    "errors": "",     // 失败的信息
    "data": {},       // 成功响应的信息
    "url": "",         // 搭配 code: 302 实现页面跳转
}

12345678

具体实例

成功返回用户信息

{
    "code": 200,
    "status": "success",
    "data": {
        "id": 1,
        "name": "zodream"
    },
}

12345678

失败返回提示无权限需要登录

{
    "code": 302,
    "status": "failure",
    "errors": "当前账户无权限,请先登录",
    "url": "/login?redirect_uri=/"
}

123456

RESTful 响应

状态码判断是否处理成功

具体实例

成功返回用户信息

HTTP/1.1 200 OK

{
    "id": 1,
    "name": "zodream"
}

1234

成功返回用户列表

HTTP/1.1 200 OK

{
    "data": [
        {
            "id": 1,
            "name": "zodream"
        }
    ]
}

12345678

失败返回提示无权限需要登录

HTTP/1.1 302 Found

{
    "code": 302,
    "message": "当前账户无权限,请先登录",
}

1234

具体代码实现,

netcore 版本为例

    public interface IJsonResponse
    {
        public object Render(object data);

        public object RenderData(object data);

        public object RenderData(object data, string message);

        public object RenderPage<T>(Page<T> page);

        public object RenderFailure(string message, int code);

        public object RenderFailure(string message);
    }

1234567891011121314

普通版本的实现

    public class JsonResponse : IJsonResponse
    {
        public object Render(object data)
        {
            return data;
        }

        public object RenderData(object data)
        {
            return Render(new
            {
                code = 200,
                status = "success",
                data
            });
        }

        public object RenderData(object data, string message)
        {
            return Render(new
            {
                code = 200,
                status = "success",
                data,
                message
            });
        }

        public object RenderFailure(string message, int code)
        {
            return new
            {
                code,
                status = "failure",
                message
            };
        }

        public object RenderFailure(string message)
        {
            return RenderFailure(message, 404);
        }

        public object RenderPage<T>(Page<T> page)
        {

            return Render(new
            {
                code = 200,
                status = "success",
                data = page.Items,
                paging = new
                {
                    limit = page.ItemsPerPage,
                    offset = page.CurrentPage,
                    total = page.TotalItems,
                    more = page.CurrentPage < page.TotalPages
                }
            });
        }
    }

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061

RESTful 的实现

    public class PlatformResponse : IJsonResponse
    {

        public PlatformModel Platform { get; set; }

        public object Render(object data)
        {
            return data;
        }

        public object RenderData(object data)
        {
            return Render(new
            {
                data,
                appid = Platform.Appid
            });
        }

        public object RenderData(object data, string message)
        {
            return Render(new
            {
                data,
                message
            });
        }

        public object RenderFailure(string message, int code)
        {
            return new
            {
                code,
                message
            };
        }

        public object RenderFailure(string message)
        {
            return RenderFailure(message, 404);
        }

        public object RenderPage<T>(Page<T> page)
        {

            return Render(new
            {
                data = page.Items,
                paging = new
                {
                    limit = page.ItemsPerPage,
                    offset = page.CurrentPage,
                    total = page.TotalItems,
                    more = page.CurrentPage < page.TotalPages
                }
            });
        }
    }

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

通过中间件注入当前请求

public Task InvokeAsync(HttpContext context)
{
    context.Items.Add("json", new JsonResponse());
    return _next.Invoke(context);
}

12345

再控制器中使用

HttpContext.Items["json"] as IJsonResponse

1

在这里有一个问题,即状态码并没有实现,可以考虑拓展方法,把HttpContext当作参数传入,内部做状态码输入

转载请保留原文链接: https://zodream.cn/blog/id/184.html