代码分析(一)

2023-11-17

2021SC@SDUSC

分析前言

对于APIJSON的代码分析首先就是,看一下该项目的作用以及如何进行,看一下原来不部署这个项目的正常流程:

原始

再来看一下部署上APIJSON后项目的流程走向:
后来

接下来开始按照这个流程对相应的代码进行分析。



AbstractParser类(解析器)

将request解析为JSON对象

此次我们分析一下APIJSON的代码解析器——对应的项目类为AbstractParser

​ 在 说明文档 中此类描述为 parser for parsing request to JSONObject,意思就是将request请求解析成为JSON对象,来看一下关键核心代码:

    @Override
	public String parse(String request) {
		return JSON.toJSONString(parseResponse(request));
	}
	/*
	 *解析请求json并获取对应结果
	 */
	@NotNull
	@Override
	public String parse(JSONObject request) {
		return JSON.toJSONString(parseResponse(request));
	}

关键就是一个parse函数的调用将request转为固定的JSON类型的字符串,其中调用了parseResponse函数:

对于所用parseResponse函数:

    public JSONObject parseResponse(String request) {
		Log.d(TAG, "\n\n\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"
				+ requestMethod + "/parseResponse  request = \n" + request + "\n\n");

		try {
			requestObject = parseRequest(request); //解析为JSON对象,方便构造
		} catch (Exception e) {
			return newErrorResult(e);
		}

		return parseResponse(requestObject);//根据JSON请求对象,返回装配好的JSON响应对象
	}

而parseResponse(String)函数则是将request通过parseRequest转化为JOSNObject,这个是为了以后方便构造,然后再返回调用parseResponse(JSONObject)方法得到的JSON响应对象

对于所用函数parseRequest:

   /**解析请求JSONObject
	 * @param request => URLDecoder.decode(request, UTF_8);
	 */
	public static JSONObject parseRequest(String request) throws Exception {
		JSONObject obj = JSON.parseObject(request);
		if (obj == null) {
			throw new UnsupportedEncodingException("JSON格式不合法!");
		}
		return obj;
	}

就是调用了parseObject将String的request转化为JSONObject,并进行了异常处理

parseResponse(JSONObject)方法

而对于parseResponse(JSONObject)方法:这个方法就是去解析请求json并获取对应结果,什么意思呢?就是我现在已经经过前面的一系列操作获得了可以进行我们操作的request请求,然后我们的parseResponse就可以通过这个request从数据库中获取到所对应的内容返回了,如果还不理解的话,我直接举个例子,比如我们前端的请求是下面这样子:

  "[]":{                            
    "page":0,                       
    "count":2,
    "Moment":{                      
      "content$":"%a%"              
    },
    "User":{
      "id@":"/Moment/userId",        //User.id = Moment.userId  缺省引用赋值路径,从所处容器的父容器路径开始
      "@column":"id,name,head"       //指定返回字段
    }
  }
}

那么我们的结果就应该是

{
   "[]":[
     {
      "Moment":{
        "id":15,
        "userId":70793,
        "date":1486541171000,
        "content":"APIJSON is a JSON Transmission Structure Protocol…",
        "praiseUserIdList":[
          82055,
          82002,
          82001
        ],
        "pictureList":[
          "http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
          "http://common.cnblogs.com/images/icon_weibo_24.png"
        ]
      },
      "User":{
        "id":70793,
        "name":"Strong",
        "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000"
      },
      "Comment[]":[
        {
          "id":176,
          "toId":166,
          "userId":38710,
          "momentId":15,
          "date":1490444883000,
          "content":"thank you"
        },
        {
          "id":1490863469638,
          "toId":0,
          "userId":82002,
          "momentId":15,
          "date":1490863469000,
          "content":"Just do it"
        }
      ]
    }
   ]
  "code":200,
  "msg":"success"
  }

那么我们通过前面的一系列解析已经获得了这个请求的具体数据,然后我们接下来就是获取到数据库的中的request所请求的数据,这个例子中,首先就是"[]"表示就是去请求一个数组,然后是“page=0”和count=2是数组的条件,然后Moment代表//请求一个名为Moment的对象,括号里面代表的是moment对象的条件,根据这些条件,然后就把它转成相关的sql去执行获取到对应的数据。
然后来看一下这个方法具体的执行时是如何进行的:

   /**
     * @param request
     * @return requestObject
     */
    @NotNull
    @Override
    public JSONObject parseResponse(JSONObject request) {
    
        requestObject = request;
        verifier = createVerifier().setVisitor(getVisitor());

        if (isNeedVerifyRole() && globleRole == null) {
            try {
                setGlobleRole(RequestRole.get(requestObject.getString(JSONRequest.KEY_ROLE)));
                requestObject.remove(JSONRequest.KEY_ROLE);
            } catch (Exception e) {
                return extendErrorResult(requestObject, e);
            }
        }

        final String requestString = JSON.toJSONString(request);//request传进去解析后已经变了

        queryResultMap = new HashMap<String, Object>();

        Exception error = null;
        sqlExecutor = createSQLExecutor();
        onBegin();
        try {
            queryDepth = 0;
            requestObject = onObjectParse(request, null, null, null, false);

            onCommit();
        } catch (Exception e) {
            e.printStackTrace();
            error = e;

            onRollback();
        }

        requestObject = error == null ? extendSuccessResult(requestObject) : extendErrorResult(requestObject, error);

        JSONObject res = (globleFormat != null && globleFormat) && JSONResponse.isSuccess(requestObject) ? new JSONResponse(requestObject) : requestObject;

        onClose();
        return res;
    }

首先就是进行了一个权限的判定,然后就直接调用了sqlconfig里面的方法,直接执行获取到了结果并且放入到JSONObject里面。

而JSON类的parseRequest函数最终是通过com.alibaba.fastjson的库函数最终将String转化为JSON类型的对象,而这个是涉及到了另外的项目,这也同时就让我们产生了一个疑问–不属于本项目但是和本项目息息相关的代码应该去分析吗?在我和我们小组进行讨论后,我们整个组觉得既然要分析整个项目,那么关联到本项目的一些额外的代码也应该去做一下合适的分析,以便于将我们的代码的上下文搞清楚,这个接下来会进行分析。

以上 为本次代码分析内容。
与小组成员讨论的扩展为:这次的分析我与讨论了一下不属于本项目的代码,但只要和本项目息息相关的代码也应该对其进行相关的分析,以便我们搞清楚本项目代码的上下文,这也更加便于我们进行后续代码的分析。因为代码分析课程其实不只是代码分析,更是让我们获得更多的学习机会,在代码分析的过程中,我们可以感受到前辈大牛们的代码严谨、思想深厚的理念,同时我们在分析时遇到的问题便可以让我们懂得更多,所以不应该局限于本项目的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码分析(一) 的相关文章

随机推荐

  • 生成一个6位数的随机密码,且需要包括字符、数字、特殊符号

    实现思路 第一步 6位数的密码 且需要包括字符 数字 特殊符号这三个元素 将三个元素组成6位时每个元素的排列组合列举出来 第二步 从第一步的排列组合中随机抽取一个排列组合类型 i j k 第三步 从所有的字符 数字 特殊符号中随机抽取i个字
  • Zookeeper到底是干嘛的

    在Zookeeper的官网上有这么一句话 ZooKeeper is a centralized service for maintaining configuration information naming providing distr
  • 数据集笔记:杭州 & 上海 地铁客流数据

    数据集地址 PVCGN data at master liuwj2000 PVCGN github com 1 数据集介绍 从5 15到23 30的地铁乘客流量预测 使用前四个时间间隔 15分钟 x 4 60分钟 的地铁乘客流量 进 出流量
  • Python(1)--Python安装目录介绍

    DLLs Python 自己使用的动态库 Doc 自带的 Python 使用说明文档 include 包含共享目录都是 h的文件 Lib 库文件 放自定义模块和包 pip 安装下载的包会放这Lib site packages 这个路径可以修
  • 云原生微服务应用的平台工程实践

    作者 纳海 01 微服务应用云原生化 微服务是一个广泛使用的应用架构 而如何使得微服务应用云原生化却是近些年一直在演进的课题 国内外云厂商对云原生概念的诠释大同小异 基本都会遵循 CNCF 基金会的定义 云原生技术有利于各组织在公有云 私有
  • 形态学的图像处理

    数字形态学是图像处理与分析领域的重要工具之一 数学形态学可以用来解决抑制噪声 特征提取 边缘检测 图像分割 形状识别 纹理分析 图像恢复与重建 图像压缩等图像处理问题 本文将会对形态学的图像处理进行一些通俗的原理解释和Matlab代码验证
  • 初始C语言——数组的行和列互换

    define CRT SECURE NO WARNINGS 1 防止visual studio2013以上版本scanf报错 vc6 0环境可忽略 include
  • 小案例:页面滚动事件以及导航栏点击

    HTML html实现方法一 导航栏a标签href 要与下列div中id属性对应 点击a标签即可滑动到对应id的div div class navbar 导航栏 ul class rightheader li a class page sc
  • 5G承载网络技术发展趋势

    导读 随着5G建设的日渐加快 5G与云网融合共生互促 推动承载网络技术不断发展演进 云网融合必将成为行业高质量发展的必然趋势 当前云网融合面临着新需求与新挑战 5G承载网络技术在确定性保障 定制化服务和智能管控运维等技术方面也面临着新的发展
  • 5个最流行的可用于移动开发的嵌入式数据库简介

    嵌入式数据库是轻量级的 独立的库 没有服务器组件 无需管理 一个小的代码尺寸 以及有限的资源需求 目前有几种嵌入式数据库 你可以在移动应用程序中使用 让我们来看看这些最流行的数据库 数据库 数据类型存储 License 支持平台 Berke
  • 【2019.11.12】C语言中求最大值和最小值的两种方法

    C语言中求最大值和最小值的两种方法 编写完整的程序 输入三个数 输出其中的最大数 最小数 输入说明 两个整数N1 N2 N3 输出说明 最大数 最小数 输入样例 5 4 9 输出样例 9 4 方法一 include
  • C++学习教程大纲

    以下是C 学习教程的大纲 第一部分 基础知识 C 简介 什么是C C 的历史 C 的特点和优势 开发环境的搭建 安装C 编译器 配置开发环境 第一个C 程序 Hello World程序 程序的结构 编译和运行程序 数据类型和变量 基本数据类
  • jQuery的三种$()

    号是jQuery 类 的一个别称 构造了一个jQuery对象 所以 可以叫做jQuery的构造函数 个人观点 呵呵 1 可以是 expresion 即css选择器 Xpath或html元素 也就是通过上述表达式来匹配目标元素 比如 a 构造
  • 应急响应篇:windows入侵排查

    前言 应急响应 Incident Response Service IRS 是当企业系统遭受病毒传播 网络攻击 黑客入侵等安全事件导致信息业务中断 系统宕机 网络瘫痪 数据丢失 企业声誉受损 并对组织和业务运行产生直接或间接的负面影响时 急
  • 《码上行动:零基础学会Python编程》书籍分享

    Python是一种高级的 面向对象的编程语言 由Guido van Rossum于1991年开发 它具有简洁 易读和可维护的语法 被广泛用于科学计算 Web开发 数据分析 人工智能等领域 以下是Python的一些特点和优势 简洁易读 Pyt
  • 还对Flutter理解不透?看完这些迟早成为大佬~

    Flutter是什么 Flutter简介 Flutter是谷歌的移动UI框架 可以快速在iOS和Android上构建高质量的原生用户界面 一份代码可以同时生成iOS和Android两个高性能 高保真的应用程序 Flutter目标是使开发人员
  • 2023年最火副业:Python爬虫兼职,一周赚7800元,一天只要两小时 !

    现在学习python的人越来越多了 跟大家简单如何利用python搞副业赚钱的 想要利用 Python 赚钱的方式还是比较多的 其中接单和投稿算是两种比较简单的方式了 如果你是业余学python爬虫 可以去淘宝上加了找了几个店铺直接问需要爬
  • 数据结构和算法(4):栈与队列

    栈 ADT 及实现 栈 stack 是存放数据对象的一种特殊容器 其中的数据元素按线性的逻辑次序排列 故也可定义首 末元素 尽管栈结构也支持对象的插入和删除操作 但其操作的范围仅限于栈的某一特定端 也就是说 若约定新的元素只能从某一端插入其
  • 文本域左边的文字处理

    文本域左边文字默认是bottom 如果想要左边文字与文本域顶部平齐 那么只需要设置label的vertical align的属性值为top即可 设置前 设置后
  • 代码分析(一)

    2021SC SDUSC 分析前言 对于APIJSON的代码分析首先就是 看一下该项目的作用以及如何进行 看一下原来不部署这个项目的正常流程 再来看一下部署上APIJSON后项目的流程走向 接下来开始按照这个流程对相应的代码进行分析 Abs