您的当前位置:首页正文

基于RESTful的即时通信业务开放接口的设计与实现

来源:化拓教育网
基于RESTful的即时通信业务开放接口的设计与实现

宋昌业

大兴安岭地委党校

165000

摘要:本文将分析使用RESTful架构实现服务器端即时通信开放接口的优势,并介绍如何使用RESTful构架设计及实现即时通信的开放接口。本文介绍的即时通信开放接口所具有的主要功能有:1-1聊天,群组聊天,通知订阅。本文所涉及到的技术包括:服务器端即时通信开放接口的业务逻辑的设计,数据库表的设计,JAX-RS包的使用。

关键字:RESTful架构风格,即时通信,开放接口

中图分类号:E965

文献标识码:A

一、基于RESTful的开放接口系统结构

即时通信是基于移动互联网的一项开放业务。其开放接口的三种构架有CORBA(通用物件请求代理架构)、SOAP(简单对象访问协议)、REST(表述性状态转移)。

RESTful风格充分利用了HTTP定义的四种常用操作:GET,POST,DELETE,PUT,并且可以为即时通信中的各种资源(包括实体和服务)定义唯一的URI,使得对这些资源的操作十分的方便。与其他两种架构/协议相比,RESTful风格的开发复杂度更低,更易于扩展系统功能。综上所述,使用RESTful的体系结构来开发即时通信服务器端的开放接口更为合适。即时通信业务的系统流程图如图1所示,整个业务使用了B/S模型。若客户端希望使用即时通信的功能,首先需要向通信服务器发出请求。通信服务器收到并分析客户端请求,将客户端发来的消息表示成XML格式(消息体可以为空),将这些信息封装到HTTP包中,根据客户端请求编写相应的URL作为HTTP包的目的地址,最后将此HTTP包发送到聊天服务器。不同的URL对应了聊天服务器不同的接口(服务),聊天服务器做出相应处理,期间可能需要查询或修改数据库。接口主要功能有聊天信息的发送、群组聊天、通知订阅。

客1户客端户端2通信服**务*器客户端N图1系统流程图

二、基于RESTful的IM开放接口的设计(一)资源设计

聊天服务器数据库1、资源概述:如图2描述了整个即时通信业务所用到的主要资源(服务也是一种资源)。由根节点/chat/{userId}到由蓝色矩形表示的资源有唯一的一条路径,该路径上的各字符串可组成一串URL地址,即该资源对应的URL地址。

/chat/{userId}

/admin/status/oneToOne/{otherUserId}/messages/group/{groupId}/messages/participants/subscriptions/{subscriptionsId}/{participantsId}/status图2资源图

2、聊天接口的资源描述见表1

表1聊天接口资源描述

资源

URL路径基本URL:http://localho

数据结HTTP动作构

GET

PUT

POST

DELETE

st:8080/demo/services/chat/{userId}

聊天信息

/oneToOne/{otherUserId}/messages

3、群组聊天接口的资源描述见表2

表2群组聊天接口资源描述

资源

URL路径基本URL:http://localhost:8080/demo/services/chat/{userId}/group

单个群

GroupChatSessionInfomationChatMessage

nono发送一no条信息

数据结HTTP动作构

GET

PUT

POST

DELETE

nono创建一no个群

单个群/{groupId}/paGroupChrticipants

atSessionInfomation

nono群的创no建者添加成员

群组中某一/{groupId}/pano参与者

rticipants/{participantId}

获取群no的某个参与者的信息

no删除群的某个参与者

群组中某一/{groupId}/pano参与者的状rticipants/{pa

nono

接受加no入某群

态rticipantId}/status

的邀请

群组聊天的/groupId/me单个信息

ssages

ChatMessage

nono

发送一no个群组聊天信息

4、通知订阅接口的资源描述见表3

当前即时通信业务有两个通知,NOTE_1及NOTE_2,这两个通知均与群组聊天有关。

NOTE_1的功能是,当群的某一参与者正式加入该群或退出该群时,向该群中其他参与者发送通知,告知该用户状态的改变。

NOTE_2的功能是,当某一用户上线或离线时,向其所在群的参与者发送通知,告知该用户状态的改变。

表3订阅接口资源描述

资源

URL路径基本URL:http://localhost:8080/demo/services/chat/{userId}

聊天通知的/subscription单个订阅

s/

{subscriptionId}

聊天通知的/subscription单个订阅

s/

{subscriptionId}

(二)业务流程设计

no

no

no

退订一个聊天通知

no

no

no

订阅一no个聊天通知

数据结HTTP动作构

GET

PUT

POST

DELETE

1、1-1聊天发送消息的流程通信服务器流程:向

http://localhost:8080/demo/services/chat/{userId}/oneToOne/{otherUserId}/messages调用POST方法,发送的信息为APPLICATION/XML格式,内容为信息内容聊天服务器端流程:

收到通信服务器端请求填写完整chatMessagechatMessage的接收者是否在线?否将信息存入MESSAGES表是将填写完整的chatMessage返回发送信息的客户端结束图31-1聊天发送消息功能中聊天服务器端流程图

2、群组聊天1)创建群

通信服务器端:

向http://localhost:8080/demo/services/chat/{userId}/group调用POST方法。其中,userId是登录当前客户端的用户账号,也是新建的群的创建者。发送的信息格式为APPLICATION/XML。聊天服务器端:

收到通信服务器端请求查询数据库,得到一个可用的群号利用创建者提供的群的初始信息,创建一个群将当前数据库所有成员的信息返回给群的创建者结束图4创建群功能中聊天服务器端的流程图

2)群的创建者添加群成员通信服务器端:向

http://localhost:8080/demo/services/chat/{userId}/group/{groupId}/participants调用POST方法。

其中userId是groupId群的创建者,其他人无权执行此操作。发送的信息的格式为APPLICATION/XML,内容类似于

participant1

userId1false

participant2userId2false

省略若干participant的描述…聊天服务器端:

收到通信服务器端请求查询数据库,为对应的群组添加成员将当前数据库所有成员的信息返回给群的创建者结束图5群的创建者添加群成员功能中聊天服务器端的流程图3)删除群成员通信服务器端:向

http://localhost:8080/demo/services/chat/{userId}/group/{groupId}/participants/{participantId}调用DELETE方法。其中,userId是群号为groupId的群的创建者,participantId是某个群成员在群中的编号。聊天服务器端:

接收通信服务器请求客户端的用户删除自己是否(删除他人)否客户端的用户是群的创建者客户端的用户是群的创建者是否是返回一个错误从群中删除相应用户删除群结束图6删除群成员功能中聊天服务器端的流程图

4)查询群的某个成员的信息通

http://localhost:8080/demo/services/chat/{userId}/group/{groupId}/participants/{participantsId}调用GET方法。

其中,userId是群号为groupId的群的成员(状态为INVITED或CONNECTED)。participantId是同一个群当中的一个成员号。聊天服务器端:

接收通信服务器端请求查询相应群当中的相应客户将相应客户的信息返回客户端结束图7查询群的某个成员的信息功能中聊天服务器端的流程图6、发送群聊信息通信服务器端:

http://localhost:8080/demo/services/chat/{userId}/group/{groupId}/messages调用POST方法。其中,userId是群号为groupId的群的成员。聊天服务器端:

收到通信服务器端请求将聊天信息发送给群中其他成员结束图8发送群聊信息功能中聊天服务器端的流程图

3、聊天通知

1)订阅某个聊天通知通信服务器端:向

http://localhost:8080/demo/services/chat/{userId}/subscriptions/{subscriptionId}调用POST方法。其中,subscriptionId是合法的通知编号。聊天服务器端:

收到通信服务器端请求修改数据库结束图9聊天通知功能中聊天服务器端的流程图

2)退订某个聊天通知通信服务器端:向

http://localhost:8080/demo/services/chat/{userId}/subscriptions/{subscriptionId}调用DELETE方法。其中,subscriptionId是合法的通知编号。聊天服务器端:

收到通信服务器端请求修改数据库结束图10退订某个聊天通知功能中聊天服务器端的流程图

4、数据库设计

为实现群组聊天功能,数据库中显然应该有代表用户实体的表USERSTATUS和代表群编号实体的表GROUPID,若按照范式进行设计,则应添加代表用户实体和群实体之间关系的表USER_GROUPID,用以表示特定用

户属于哪些群。用户数及群数很大时,这个表的行数会很大。当查找某个群中所有成员时,需要在这个大表中进行选择操作,再考虑到即时通信业务的使用量,可知这个操作会频繁发生且开销很大的。出于效率的考虑,为每个群创建了表GROUPSESSION_x,用以表示群号为x的群有哪些参与者。当需要对群号为x的群成员进行操作时,只需在表GROUPSESSION_x中进行操作,效率较高。

图11是为即时通信聊天接口设计的数据库的ER图。

表GROUPIDPKID表MESSAGESPKPK,FK2PK,FK1MIDRECEIVERSENDERMTEXTMTIMESTATUSID表NOTE_xPK,FK1UIDSUBED1..1表GROUPSESSION_xPKPIDUSERIDPNAMEPSTATUSPIDENTITYIDn..1表USERSTATUSPKIDSTATUSn..1n..1FK1图11数据库的ER图

以下描述了实现即时通信业务需要使用到的数据库的各表的定义。表GROUPID仅有一列,存放当前被占用的所有群的编号。当进行创建群操作时,可利用该表查出还未被占用的最小的群编号,用此编号作为新创建的群的编号。

表GROUPSESSION_x(x是聊天群编号)存储了群号为x的聊天群的所有参与者的信息,每个参与者的信息由一行来表示。见表4

表4表GROUPSESSION_x的定义

字段名PIDUSERIDPNAMEPSTATUS

字段类型intint

varchar(20)varchar(20)

是否是主键是否否否

描述群成员的编号群成员的用户号群成员的名字群成员的状态

PIDENTITYvarchar(20)否群成员的身份

表MESSAGES仅在1-1聊天时用到,它的每行表示一条信息,RRECEIVER这条信息是由用户号为SENDER的用户发给用户号为RECEIVE的用户的,且信息发送时,用户号为RECEIVER的用户不在线,因此暂时将这条信息存于数据库中。见表5

表5表MESSAGES的定义

字段名MIDSENDER

字段类型intint

是否是主键是是

描述信息编号信息发送者的用户号

RECEIVER

int

信息接受者的用户号

MTEXTMTIME

varchar(20)bigint

否否

信息内容聊天服务器接收到信息的时间戳

STATUS

varchar(20)

信息状态

表USERSTATUS中存储了当前所有已注册的用户的用户号及该用户是否在线的信息。当用户上线/下线时,聊天服务器需要对该用户在该表中的状态进行相应改变。见表6

表6表USERSTATUS的定义

字段名IDSTATUS

字段类型intint

是否是主键是否

描述用户号用户状态

表NOTE_x(x是通知编号)中存储了所有的用户号及该用户是否订阅了通知x的信息。当用户订阅/退订通知x时,聊天服务器需要对表NOTE_x中对应该用户的SUBED字段做出相应改变。见表7

表7

表NOTE_x的定义

字段名UIDSUBED

字段类型intvarchar(5)

是否是主键是否

描述用户号

用户是否订阅了该通知

四、基于RESTful的IM开放接口的实现(一)、1-1聊天的实现

1、对1-1聊天的初始化

聊天服务器启动时,会自动创建表MESSAGES。初始时,表MESSAGES的截图如图12所示。

图12表MESSAGES的初始状态的截图

2、发送1-1聊天信息

模拟用户号为100的用户给用户号为400的用户发送信息,且用户号为400的用户当前在线。

图131-1聊天发送信息的请求

聊天服务器返回给通信服务器的信息如图13、14所示。注意消息体中status字段的值为SENDING,根据该信息,通信服务器得知当前用户号为400的用户在线,可以直接将此信息发送给用户号为400的用户。

图14信息发送完毕

若消息的接收方不在线,则聊天服务器返回给通信服务器的信息中的status字段的值为SAVEDINDB,表示该信息已存入数据库,则通信服务器不必将该信息立刻发送给接收方的客户端。(二)群组聊天的实现

1、对群组聊天的初始化

聊天服务器启动时,会自动创建表GROUPID及表CURRENTGROUPID。初始时,两个表的截图均如图15所示。

图15表GROUPID及表CURRENTGROUPID的初始状态

2创建群

模拟用户号为100的用户创建一个群,除他自己之外,群的初始参与者还有姓名为BILL,用户号为200的用户。由通信服务器发送给聊天服务器的该请求的内容如图16所示。

图16创建一个群的请求

聊天服务器收到此请求之后,查找表GROUPID,选出当前没有被使用的最小的群编号,作为新创建的群的编号。新的群创建完毕后,聊天服务器返回给通信服务器的内容如图17所示。

图17群创建成功的信息

3、群的创建者为群添加新成员

只有群的创建者可以继续为该群添加参与者,这些新添加的参与者的初始状

态为INVITED。

假设用户号为100的用户为群号为0的群的创建者,他要继续为该群添加新成员,则由通信服务器发送给聊天服务器的该请求的内容如图18所示。

图18群的创建者继续为群添加新成员的请求

4、发送群聊信息

假设群号为0的聊天群已经被创建,用户号为100的用户希望在该群中发送信息,该用户发送群信息的请求如图19所示。

图19发送群信息

此功能未完全实现。当通信服务器的URL地址确定后,需要添加一个代码段,功能为向通信服务器发送信息,信息体为chatMessage。除此之外,当前的其余功能均已实现。

5、删除群中的某参与者

由于删除群中的某个参与者这一功能较为复杂,若用图片表示业务过程会占用较多篇幅,因此改用以主要代码段的方式表示该功能的实现,相应的主要代码段如图20所示。

图20删除群中某个参与者的功能的主要代码

(三)聊天通知的实现

1、通知表的创建/删除

只有系统管理员可以进行通知表的创建的操作。因为由于表的创建和删除两个操作在业务逻辑及实现上十分相似,在此仅呈现创建通知表的实现。

假设用户号为100的用户为系统管理员,他需要创建一个新的通知表NOTE_2,设置表SUBED属性的默认值为“NO”。由通信服务器发送给聊天服务器的该请求如图21所示。

图4-15创建通知表

通知表创建完毕后,该表为空,需要为该表导入当前所有用户。管理员可以再次发送另一个请求,完成此功能。由通信服务器发送给聊天服务器的该功能的请求如图4-16所示。

图21为通知表导入用户

以上两操作进行完毕后,通知表NOTE_2的内容如图22所示。

图22NOTE_2表的内容

2、订阅/退订某通知

由于订阅和退订两个操作在业务逻辑及实现上十分相似,在此仅呈现订阅通知的实现。

首先,运营商需要制定某个通知,为该通知定义通知号,并在数据库中创建相应的表NOTE_x(x为通知编号),用该表表示用户是否订阅了通知x。某一时刻,NOTE_1的内容如图23所示。

图23NOTE_1表的内容

假设用户号为100的用户需要订阅某通知1,他需要相应的请求。从通信服务器发送到聊天服务器的过程中该请求的内容如图24所示。

图24订阅通知1的请求

用户号为100的用户成功订阅通知1后,表NOTE_1的内容的截图如图25所示。

图25表NOTE_1内容的截图

3、发送通知

该功能未完全实现,当通信服务器的URL地址确定后,需要添加代码段,功能为,向通信服务器发送信息,信息体为通知内容。除此之外,包括通知的接受者的查找等功能均已实现。图26给出了发送通知1的代码段。

图26发送通知1的主要代码段

本文较为简洁地介绍了基于RESTful的IM开放接口的设计和实现。从资源、业务流程、数据库等方面,对基于RESTful的IM开放接口进行了设计。给出了调用实现后的接口的大多数功能的截图,或某些功能的重要代码段。

参考文献

[1]昊斯特曼等.Java核心技术:卷1基础知识.北京:机械工业出版社,2008-6-1.

[2]BillBurke.RESTfulJavawithJAX-RS.O’ReillyMediaInc,2009-11-1.面向移动互联网的业务能力开放技术标准综述

[3]胡尼亚,张鹏,刘晓靖,杨瑞.面向移动互联网的业务能力开放技术标准综述.信息通信技术,2011年04期.

[4]王建斌,胡小生,李康君,赵靓.REST风格和基于SOAP的WebServices的比较与结合.计算机应用与软件,2010年09期.

[5]许卓明,栗明,董逸生.基于RPC和基于REST的Web服务交互模型比较分析.计算机工程,2003年20期.

因篇幅问题不能全部显示,请点此查看更多更全内容