发明内容
为了克服现有技术的不足,本发明的目的在于提供一种轻量级API Server开发框架,能够提高API Server的开发效率。本发明的目的之二在于提供一种轻量级API Server开发方法,能够提高API Server的开发效率。
本发明的轻量级API Server开发框架,采用如下技术方案实现:
一种轻量级API Server开发框架,包括:
API子系统,其用于定义所述API Server所支持的API集合;
Server子系统,其用于提供对外的API服务;
Client子系统,其用于调用所述Server子系统提供的API服务;
所述API集合中的每一API由三部分定义,分别为API标识、一个API请求类和一个API响应类,所述API标识用于区分不同的API,所述API请求类用于定义API的请求参数,所述API响应类用于定义API的响应参数;
所述Server子系统包括API实现类库、管理器和控制器;所述控制器用于向所述管理器传递API的请求数据以及用于向所述Client子系统传递API的响应数据;所述管理器用于根据接收到的API的请求数据,调用API实现类库中对应的API实现类,以得到API的响应数据,并将响应数据返回给控制器。
进一步地,所述Server子系统和所述Client子系统之间采用HTTP协议实现通信。
进一步地,所述Server子系统,其采用Jetty容器作为WEB容器。
进一步地,所述Client子系统调用API服务时,采用GET方式将API的请求参数以URL参数的方式提交给所述Server子系统。
进一步地,所述轻量级API Server开发框架还包括异常处理模块,所述异常处理模块通过HTTP Status Code携带异常信息。
进一步地,所述Server子系统还包括配置读取模块和配置文件,所述配置读取模块用于读取配置文件的配置信息,并将配置信息转发给所述管理器;所述管理器还用于根据接收到的配置信息,加载对应的API实现类,以获取该API实现类对应的API标识,并将该API标识更新至服务注册表。
本发明的轻量级API Server开发方法,采用如下技术方案实现:
一种轻量级API Server开发方法,应用上述的轻量级API Server开发框架,所述开发方法包括:
根据业务需求确定所述API Server的API集合;
对于API集合中的每一API,在API子系统中定义对应的API请求类和API响应类;
对于API集合中的每一API,在Server子系统的API实现类库中定义对应的API实现类;
将API子系统、Server子系统和Client子系统部署到对应的系统平台上。
相比现有技术,本发明的有益效果在于:
本发明所提供的轻量级API Server开发框架以及轻量级API Server开发方法,包括Server子系统、Client子系统和API子系统,其中API子系统用于定义API Server所支持的API集合,Server子系统包括有API实现类库,其包括有用于定义API业务逻辑的API实现类,在开发过程中,对于每一API,只需在API子系统添加上一对API请求类和API响应类,并根据实际业务需要,在API实现类库中添加对应的API实现类即可,使得开发人员可以专注在API的编程上,极大减少了编程的代码量,提高了开发效率。
具体实施方式
下面,结合附图以及具体实施方式,对本发明做进一步描述,需要说明的是,在不相冲突的前提下,以下描述的各实施例之间或各技术特征之间可以任意组合形成新的实施例。
图1所示,为本发明较佳实施例的轻量级API Server开发框架的示意图,该开发框架包括API子系统、Server子系统和Client子系统,均基于Java语言实现,通信方式被设计为HTTP协议方式。参数序列化的格式为JSON。这两种协议(格式)都是非常简单的文本格式,而且有大量成熟的开发和支持工具可以借用。
1)API子系统:其用于定义API Server所支持的API集合,API集合中的每一API由三部分定义,分别为:
①API标识:其为API服务的名称,是API服务的唯一标识,用于区分不同的API服务;
②一个Request类即API请求类:其用于定义API的请求参数及其格式;
③一个Response类即API响应类:其用于定义API的响应参数及其格式。
当要为系统添加新的API功能时,需要在API子系统中添加对应的一对API请求类和API响应类。Client子系统向Server子系统调用API服务时,调用对应的API请求类来封装有关的请求数据,从而获得对应的API请求实例,Server子系统在接收API的请求数据时,也会调用对应的API请求类来封装请求数据,以获得对应的API请求实例。同理,在API子系统接收API响应时或者Server子系统返回API响应时,对应的API响应类被调用来封装有关的API响应数据。
2)Server子系统,其为提供API服务的服务端,用于提供对外的API服务,包括API实现类库、一个管理器和一个控制器;该控制器为基于Spring Framework实现的Servlet;该控制器用于向管理器传递API的请求数据以及用于向Client子系统传递API的响应数据;该管理器用于根据接收到的API的请求数据,调用API实现类库中对应的API实现类,以得到API的响应数据,并将响应数据返回给控制器。在本实施例中,Server子系统还包括有配置单元,配置单元包括有配置读取模块和配置文件,配置读取模块用于读取配置文件的配置信息,并将配置信息转发给管理器;管理器还用于根据接收到的配置信息,加载对应的API实现类,以获取该API实现类对应的API标识,并将该API标识更新至服务注册表。
在本实施例中,Server子系统具备如下特点:
①采用轻量级的嵌入式的WEB容器Jetty,提供对外的HTTP服务;
②应用程序框架采用Spring Framework,它提供的清晰MVC架构让API Server的实现更加简单明了;
③API实现类库包括有API实现类,对于Server子系统所提供的任一API,在API实现类库中均定义有一个对应的API实现类,该API实现类用于定义该API的业务逻辑;
④Server子系统包括有一个ActionManager类,即管理器,其用于管理系统中所有的API,具体处理逻辑为:根据传入的API请求对象,调用对应的API实现类,返回一个对应的API响应对象;
⑤Server子系统包括有一个ApiController类,即控制器,它是一个基于Spring框架实现的Servlet,它解析客户端提交的API请求参数,并且调用ActionManager类,获得API的执行结果,并且把结果通过Spring框架的View类的render方法转换为JSON格式,返回给客户端;
⑥服务器对外仅提供一个唯一的Servlet,也就是ApiContoller类,其URL路径为“/api”,成为API Servlet。Client子系统的API参数通过URL参数的方式来提交。其中,有一个特殊的URL参数“_action”用来区分不同的API调用。
3)Client子系统,其为调用API服务的客户端;
Client子系统包括一个ApiClient类,用于调用远程API服务,ApiClient包含一个address属性,用于指明远程服务器的Internet Socket地址;它有一个call方法,该方法传入一个API请求实例,返回对应的远程API服务的处理结果即API响应实例;并且ApiClient使用JDK自带的HttpURLConnection来调用远程服务器以HTTP Servlet形式实现的APIs。
Client子系统调用API服务时,采用GET方式将API的请求参数以URL参数的方式提交给Server子系统。
下面结合一个简单的echo API为例,说明API的格式和相关设计。该API用于接收用户的请求参数,并且复制请求参数作为响应。
1.API请求URL,例如
https://localhost:8100/api?_action=echo&msg=hello%20world&intField=1234 |
本实施例中,所有的API都使用同样的servlet:”/api”;
不同的API功能通过特别的URL参数“_action”来进行区分。这样的设计使得服务器的实现简单很多,因为只需要在一个servlet中实现所有API服务;
API的参数通过URL参数的方式来提交,一般来说,参数都是原子类型,也可将系统设计为支持JSON格式的参数。参数的编码格式可以为:application/x-www-form-urlencoded;
仅需要GET一种HTTP Method就能满足所有的API需求,可以添加额外的HTTPHeader来进行必要的权限认证等额外功能的开发。
2.API响应体,例如
{“msg”:”hello world”,”intField”:1234} |
响应体使用标准的JSON格式。响应数据包的response header中的Content-Type头默认为application/json;charset=utf-8。如果交互正常则返回HTTP Status Code为200,对于API调用失败时平台返回的异常响应输出由code,text参数组成,分别用于描述错误码和错误信息。本实施例采用的异常处理机制的错误码定义如下表1所示:
表1.错误码定义
本实施例的轻量级API Server开发框架还包括异常处理模块,其实现了如表1所示的异常处理机制。
本实施例的轻量级API Server开发框架具有如下优点:
1.服务器采用了嵌入式、轻量的Jetty,仅仅使用Spring框架的基础功能,满足快速、低成本的开发要求;
2.概念简单,仅仅使用一个Servlet来实现API服务。通过不同API标识来区分不同的API服务,而每一个API仅仅需要一对API请求类、API响应类来进行定义。这种极简的概念使得系统非常容易理解和实现,并降低了使用成本。
3.开发API Server时,开发人员只需专注于API子系统和API实现类的编程,降低了代码量,提高了开发效率;
4.可配置,Server子系统可以自动扫描API实现类,来动态添加所支持的API功能。
本实施例还提供了一种轻量级API Server开发方法,该方法应用了如本实施例的轻量级API Server开发框架,该开发方法包括以下步骤:
步骤S1:根据实际业务需求确定API Server的API集合;
步骤S2:对于API集合中的每一API,在API子系统中定义对应的API请求类和API响应类;
步骤S3:对于API集合中的每一API,在Server子系统的API实现类库中定义对应的API实现类,并在配置文件中添加上该API实现类的配置信息;
步骤S4:将API子系统、Server子系统和Client子系统部署到对应的系统平台上。
下面以开发一个echo API为例,描述API Server的开发流程。
1)在API子系统中定义一个API请求类EchoRequest,用来规定API的请求参数;其代码如下:
2)在API子系统中定义一个API响应类EchoResponse,用来规定API的响应参数,其代码如下:
3)在Server子系统中定义一个API实现类EchoAction,来定义API的业务逻辑,其代码如下:
4)在Server子系统的配置文件actions.properties中配置新的API实现类,添加如下一行配置中:
villa.agent.server.action.impl.EchoAction |
5)启动Server子系统时,其从配置文件中读出上面的一行配置,然后ActionManager(即管理器)会自动加载EchoAction,从EchoRequest的注解@ApiAction中读出对应的API标识为“echo”,于是就在服务注册表中把名为“echo”的API实现类设为EchoAction。当Server子系统接收到“_action=echo”的API请求的时候,就会调用EchoAction实例的execute方法去处理请求,得到响应结果。
下面以echo API为例,描述一次API调用的过程。这个过程包括从客户端发出请求开始,到服务器接收请求以及执行请求,直到客户端接收到响应为止。为了简化描述,以下描述把异常处理部分忽略掉,实际情况下,异常处理是整个流程中非常重要的一部分。
1.客户端设置ApiClient的服务器端Socket地址字段address,并获取ApiClient实例。
2.创建EchoRequest实例,设置请求参数,调用ApiClient#call(EchoRequest)。
3.ApiClient把EchoRequest实例序列化成JSON格式,并且组成URL参数。
4.把URL参数和API标识参数“_action=echo”以及路径“/api?”一起串成完整的HTTP请求URL,使用HttpURLConnection把HTTP请求发送到服务器端。
5.服务器端的Jetty容器收到客户端HTTP请求。根据路径“/api?”把请求转给ApiController。
6.ApiController把API标识和剩余的URL参数Map集合转发给ActionManager。
7.ActionManager根据API标识,找出对应的API实现类EchoAction的实例。接着把上一步传进来URL参数集合Parse成JSON对象。然后再把JSON对象反序列化成EchoRequest实例。接着把EchoRequest实例传到EchoAction实例的#execute(EchoRequest)执行,得到结果EchoResponse返回到ApiController。
8.ApiController把上一步结果EchoResponse序列化成JSON对象,然后再转换成JSON字符串,封装成ModelAndView对象,最后Jetty容器把JSON字符串的结果作为Body封装成HTTP响应返回给客户端。
9.客户端通过HttpURLConnection收到HTTP响应,取出其中的Body内容(JSON字符串)。接着把JSON字符串反序列化成EchoResponse实例。
10.最后,ApiClient把EchoResponse实例作为call函数的返回,整个API调用过程结束。
以下代码是客户端调用echo API的例子:
下面结合附图,来说明本实施例的API Server开发框架的应用场景。
参考图3和图4。在图3中,原有的企业系统包括6个分布式子系统,分别为企业子系统1、企业子系统2、企业子系统3、企业子系统4、企业子系统5和企业子系统6,并且如图3所示,也就是为每一个企业子系统添加一个API Server,其中包括API子系统、Server子系统和Client子系统,也就是说每一子系统既是客户端又是另外的企业子系统的服务端,那么这6个企业子系统之间可以相互调用功能或者数据,由于本实施例的API Server开发框架是十分轻量的,非常适合这种分布式部署的子系统。在图3中,所有的企业子系统,其所部署的Client子系统都是一样的,可以直接复用本实施例的API Server开发框架的Client子系统。另外,对于每一企业子系统,其API子系统以及其Server子系统需要根据实际需求来进行开发,例如,如果每一企业子系统都需要调用其他企业子系统的所有功能或数据,那么可以将API子系统1、API子系统2、API子系统3、API子系统4、API子系统5和API子系统6都开发为一样的API子系统,其定义了所有企业子系统所需要的所有对外接口,当然,根据实际需求,这6个API子系统也可能是不一样的。在开发Server子系统时,每一不同的企业子系统对应不同的Server子系统,例如在Server子系统1中仅需要定义用于调用企业子系统1的功能或数据的API实现类即可。
在图4中,利用本实施例的API Server开发框架为一个原有的企业系统开发一个对外的代理API,可以屏蔽企业系统内部实现的异构性和复杂性。代理API的每一个API实现类用于调用原有企业系统内部的一种功能或者一种数据。如图4所示,运行代理API的服务器需要部署有Server子系统和API子系统,运行代理API的客户端需要部署有Client子系统和API子系统。
上述实施方式仅为本发明的优选实施方式,不能以此来限定本发明保护的范围,本领域的技术人员在本发明的基础上所做的任何非实质性的变化及替换均属于本发明所要求保护的范围。