代码分析(一)

article/2025/10/7 8:02:43

2021SC@SDUSC

分析前言

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

原始

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

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



AbstractParser类(解析器)

将request解析为JSON对象

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

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

    @Overridepublic String parse(String request) {return JSON.toJSONString(parseResponse(request));}/**解析请求json并获取对应结果*/@NotNull@Overridepublic 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@Overridepublic 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类型的对象,而这个是涉及到了另外的项目,这也同时就让我们产生了一个疑问–不属于本项目但是和本项目息息相关的代码应该去分析吗?在我和我们小组进行讨论后,我们整个组觉得既然要分析整个项目,那么关联到本项目的一些额外的代码也应该去做一下合适的分析,以便于将我们的代码的上下文搞清楚,这个接下来会进行分析。

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


http://chatgpt.dhexx.cn/article/lrr9Fdok.shtml

相关文章

Linux命令之lsusb

一、lsusb命令用于显示本机的USB设备列表&#xff0c;以及USB设备的详细信息。 二、lsusb命令显示的USB设备信息来自“/proc/bus/usb”目录下的对应文件。 三、Linux从/var/lib/usbutils/usb.ids识别USB设备的详细信息。 语法格式 lsusb [参数] 常用参数&#xff1a; -v显…

Linux命令-磁盘管理-lsusb

1 需求 2 语法 C:\>adb shell lsusb --help Toybox 0.8.4-android multicall binary: https://landley.net/toybox (see toybox --help)usage: lsusbList USB hosts/devices. 3 示例 adb shell lsusb 4 参考资料

嵌入式debian没有lsusb命令解决

问题 -bash: lsusb: command not found 解决

linux之lsusb命令和cd -命令使用总结

1、lsusb命令介绍 使用 lsusb 来列出 USB 设备和它的属性,lsusb 会显示驱动和内部连接到你系统的设备。直接在控制台输入 lsusb 即可 2、lsusb简单使用 在控制台输入 lsusb 效果如下 系统中同时使用了 USB 2.0 root hub 驱动和 USB 3.0 root hub 驱动。 bus 002 指明设备…

LSB

知识点 LSB即为最低有效位&#xff08;Least Significant Bit&#xff0c;lsb&#xff09;&#xff0c;这里百度了一下&#xff1a;图片中的图像像素一般是由RGB三原色&#xff08;红绿蓝&#xff09;组成&#xff0c;每一种颜色占用8位&#xff0c;取值范围为0x00~0xFF&#…

lsusb命令-在系统中显示有关USB设备信息

在 中我们使用lsusb 列出USB设备及其属性&#xff0c;lsusb用于显示系统中的USB总线及其连接的设备信息。下面介绍如何安装并使用。 系统环境 7 安装usbutils 默认Centos7系统中没有lsusb &#xff0c;我们需要安装usbutils安装包&#xff0c;才能使用lsusb&#xff1a; […

LSF-bsub命令

文章目录 一、LSF(load sharing facility)二、bsub命令三、 常用命令3.1 bhosts3.2 bqueues3.3 bjobs3.4 bkill3.5 bhist3.6 busers 一、LSF(load sharing facility) 分布资源管理的工具&#xff0c;用来调度、监视、分析联网计算机的负载。 目的&#xff1a;通过集中监控和调…

Linux下的lsusb命令详解

lsusb命令详解 参考&#xff1a; 1、https://zhuanlan.zhihu.com/p/142403866 2、https://blog.csdn.net/phmatthaus/article/details/124198879 简介 ​USB&#xff0c;是英文Universal Serial Bus&#xff08;通用串行总线&#xff09;的缩写&#xff0c;是一个外部总线标…

详解 lsusb命令

USB设备检测的一般过程 USB设备检测也是通过/proc目录下的USB文件系统进行的。为了使一个USB设备能够正常工作&#xff0c;必须要现在系统中插入USB桥接器模块。在检测开始时&#xff0c;一般要先检测是否存在/proc/bus/usb目录&#xff0c;若不存在则尝试插入USB桥接模块。 现…

lsusb

1.lsusb查看系统的USB设备 $ lsusb Bus 001 Device 006: ID 0951:1666 Kingston Technology Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 004: ID 0e0f:0008 VMware, Inc. Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB H…

Linux常用命令——lsusb命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) lsusb 显示本机的USB设备列表信息 补充说明 lsusb命令用于显示本机的USB设备列表&#xff0c;以及USB设备的详细信息。 lsusb命令是一个学习USB驱动开发&#xff0c;认识USB设备的助手&#xff0c;推荐大家使用…

Linux下lsusb命令详解

Linux下lsusb命令详解 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/142403866 ​ USB&#xff0c;是英文Universal Serial Bus&#xff08;通用串行总线&#xff09;的缩写&#xff0c;是一个外部总线标准&#xff0c;早期用于规范电脑与外部设备的连接和通讯。 ​ U…

[Kong 与 Konga 与 Postgres数据库] 之 Kuberneres 部署

1、Kong的概述 Kong是一个clould-native、快速的、可扩展的、分布式的微服务抽象层&#xff08;也称为API网关、API中间件或在某些情况下称为服务网格&#xff09;框架。Kong作为开源项目在2015年推出&#xff0c;它的核心价值是高性能和可扩展性。Kong被广泛用于从初创企业到全…

Konga arm64 安装

arm64 平台&#xff1a; 一、源码安装 konga 前提&#xff1a;安装nodejswget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-arm64.tar.xztar -xf node-v12.16.1-linux-arm64.tar.xz 配置node环境变量&#xff1a;vi /etc/profileexport NODE_HOME/home/node-v12.16…

kong/kongA docker部署+汉化

部署完成后界面 一、部署kong/kongA 1、创建一个自定义 Docker 网络以允许容器相互发现和通信&#xff1a; docker network create kong-net 2、启动一个 PostgreSQL 容器&#xff1a; sudo docker run -d --name kong-database \--networkkong-net \-v /opt/pgdata:/var/l…

konga--添加service和rouce详细步骤

注意&#xff1a;先有service后&#xff0c;才能创建rouce(可以有多个),包括删除顺序先删除route&#xff0c;再删除service。次序问题 1.添加service 是抽象层面的服务&#xff0c;他可以直接映射到一个物理服务 (host 指向 ip port)&#xff0c;也可以指向一个 upstream 来…

kong及konga的最新版本安装

1、创建docker网络 docker network create kong-net 2、运行postgresql的数据库 挂载 # docker volume create kong-volume # docker run -d --name kong-database \ --networkkong-net \ -p 5432:5432 \ -v kong-volume:/var…

使用Kong和Konga管理微服务和API

Kong是Mashape开源的高性能高可用API网关和API服务管理层。自2015年在github开源后&#xff0c;广泛受到关注。它基于OpenResty&#xff0c;进行API管理&#xff0c;并提供了插件实现API的AOP。Kong在Mashape 管理了超过15,000 个API&#xff0c;为200,000开发者提供了每月数十…

docker安装nginx kong konga

一、docker安装nginx 1. 外网直接拉取&#xff0c;拉取后跳转至第三步 docker pull nginx:1.23.3 2. 内网 &#xff08;1&#xff09;找一个外网电脑拉取镜像 docker pull nginx &#xff08;2&#xff09;将镜像打包为tar包 docker save -o nginx-1.23.3.tar nginx:1.23.3…

安装Kong和Konga

​​​​1.1 、安装Kong 1、获取kong安装包的url&#xff1a; yum install https://kong.bintray.com/kong-rpm/centos/7/kong-2.1.0.el7.amd64.rpm 2、新建并修改 kong 的配置文件&#xff08;默认配置文件位于 /etc/kong/kong.conf.default&#xff09;&#xff1a; cp /etc…