【文章摘要】
简单对象访问协议(soap )是一种用于交换数据的协议规范,是一种轻量级、简单的基于XML的协议,旨在在WEB上交换结构化和固化的信息。
在实际的软件开发项目中,SOAP通常用于处理用户数据。 也就是说,实现开户、销售、账户变更、账户检索等功能。
根据作者实际进行的基于SOAP的项目开发,详细介绍了SOAP协议和基于SOAP的开发流程。 希望通过此语句,您可以全面了解基于SOAP协议的开发。
一、soapUI和SOAP代码生成框架简介
为了基于SOAP协议开发“只要想做好事,就一定会对那个人有利”,需要准备相关的工具软件。 我最初进行开发的时候,没有考虑到工具的重要性。 代码写完后,我发现没有自检的工具。 这个时候,我赶紧给同事找了相关软件安装。 这样做影响了工作效率。 因此,没有编码写“兵马不动,饲料先行”,道具必须先安装。
本节介绍两个与SOAP相关的软件: SOAPUI和SOAP代码生成框架。1.soapUI
SOAPUI是一个基于SOAP的模拟测试工具,用于模拟WEB客户端向SOAP消息处理模块(要开发的模块)发送消息。 我们可以用这个软件对自己编写的程序进行单元和集成测试。
图1是soapUI的软件接口。
图1 soapUI的软件接口
2.SOAP代码生成框架
在基于SOAP开发时,您将使用SOAP附带的许多已经封装的函数。 为了避免重复劳动,SOAP的设计者为我们提供了一个自动生成代码的框架,称为gsoap。 您可以准备wsdl文件(如下所述),以两个简单的名称生成开发过程中所需的相关函数文件。
无论在Windows、Linux或Mac OS平台上开发程序,都可以使用此框架来生成代码。 自动生成代码的工具布局如图2所示。
图2自动生成代码的工具布局
将相应的wsdl文件放在相应的文件夹中会生成代码帧。
二、基于SOAP开发的软件模块架构
一般来说,发送SOAP消息的是直接与用户交互的外部模块,这些消息必须转换为内部消息才能执行具体的处理。 因此,基于SOAP开发的软件模块架构如图3所示。
图基于SOAP开发的软件模块体系结构
可以看到,系统通常不直接使用SOAP消息执行具体的业务逻辑,而是使用中间模块将SOAP消息转换为系统内部约定的协议,然后具体的业务执行模块进行内部协议
这样做的好处包括:
第一,将消息转换与业务执行分开,便于程序实现和问题的排除。
第二,在不暴露业务具体执行流程的情况下,提高系统的安全性能。
第三,外部SOAP协议频繁变更时,修改中间SOAP协议转换模块即可,可以频繁变更特定业务处理模块,不影响正常业务的执行。
三、基于SOAP的具体开发流程
准备好了的话,接下来编写程序。 下面以实现用户数据的管理、即添加删除复查为例,介绍整个开发的流程。1.编写wsdl文件
wsdl文件(即SOAP协议文件)用于约定要执行哪些具体操作。 例如,要在系统上执行开户操作,必须携带用户的电话号码、用户名、密码等字段。 在中,可以创建名为Isoapboss.wsdl的文件,如下所示:
? XML版本=' 1.0 '编码=' utf-8 '? wsdl 3360 definition stargetnamespace=' soap ' xmlns 3360 tns=' soap ' xmlns 3360 wsdl soap=' http://schemas.XML soap.org/org soap-envelope ' xmlns 3360 NS1=' http://mail.dto.op.web.ngmaaap XML schema ' xmlns 3360 soap enc 11=' http://schemas.XML schemaap ' xmlns 3360 soap enc 12=' 3358 www.w3.soap-encoding ' xmlns 3360 soap 11=' http://方案. XML soap.org/soap/envelope/' xmlns 3360 wsdl=' http://schemas.xmlns ' wsdl : types xsd : schemaattributeformdefault=' qualified ' elementformdefault
" targetNamespace="soap" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="CreateUserReqt"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="UserPhone" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="UserName" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="Password" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="CreateUserResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="resultcode" type="xsd:int"/> <xsd:element maxOccurs="1" minOccurs="1" name="description" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="CreateUserRequest"> <wsdl:part name="parameters" element="tns:CreateUserReqt"/> </wsdl:message> <wsdl:message name="CreateUserResponse"> <wsdl:part name="parameters" element="tns:CreateUserResponse"/> </wsdl:message> <wsdl:portType name="IsoapbossPortType"> <wsdl:operation name="CreateUser"> <wsdl:input name="CreateUserRequest" message="tns:CreateUserRequest"/> <wsdl:output name="CreateUserResponse" message="tns:CreateUserResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="IsoapbossHttpBinding" type="tns:IsoapbossPortType"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="CreateUser"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="CreateUserRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="CreateUserResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="Isoapboss"> <wsdl:port name="IsoapbossHttpPort" binding="tns:IsoapbossHttpBinding"> <wsdlsoap:address location="http://10.10.10.10:9999/soapboss/Isoapboss"/> </wsdl:port> </wsdl:service> </wsdl:definitions>对于以上文件内容,解释如下:
第一,开户时需要包括的消息字段包括UserPhone、UserName和Password,其中UserPhone为必填字段(maxOccurs和minOccurs的值均为1),UserName和Password为选填字段。响应消息包括resultcode(结果码)和description(结果描述)字段。
第二,文件最后的“http://10.10.10.10:9999/soapboss/Isoapboss”中的“10.10.10.10”和“9999”表示图3中的SOAP协议转换模块所在机器的IP地址和该模块所绑定的端口号。这两个值可以在SOAP协议转换模块的配置文件中填写。
2.利用wsdl文件生成SOAP代码框架
因为我们是在Windows下面编写的程序,所以将上一步写好的“Isoapboss.wsdl”文件放到图2中的“win32”文件夹下,如图4所示。
图4 wsdl文件放置位置示意图
从图4中可以看到,除了“Isoapboss.wsdl”文件之外,该文件夹下还有“soapcpp2.exe”和“wsdl2h.exe”两个文件,这两个文件用于生成代码框架。
在cmd窗口中依次执行“wsdl2h.exe -c Isoapboss.wsdl”和“soapcpp2.exe Isoapboss.h”命令,如图5所示。
图5 代码框架的生成命令执行示意图
执行命令之后,便在“win32”文件夹下生成了相关的代码文件,如图6所示。
图6 代码文件生成之后的文件存放示意图
我们只需要将图6中的“.c”和“.h”文件拷贝到我们的代码工程中就OK了。
3.编写具体的SOAP消息处理代码
图3中的SOAP协议转换模块用于接收、解析SOAP消息,然后转换成内部约定好的消息结构。
该模块的主要功能有这三个:接收SOAP消息、处理SOAP消息、解析SOAP消息并进行组装。下面分别来进行说明。
(1)接收SOAP消息
该处理流程的伪代码如下:
(2)处理SOAP消息
该处理流程的伪代码如下:
(3)解析SOAP消息并进行组装
这一步需要我们实现soapStub.h文件中的__ns1__CreateUser函数。
这个流程因为具体的业务不同而不同,在此不再具体说明。
以上三个流程中用的函数均为我们利用wsdl文件生成的SOAP代码框架中的已经封装好了的函数。
4.对编写的代码进行测试
按照惯例,代码编写好之后,我们便要对之进行严格的测试。
对于SOAP消息的测试,我们第一步要做的便是在soapUI软件中新建工程,并将wsdl文件导入进去。例如,我们建立一个名叫TestSoap的工程,如图7所示。
图7 新建TestSoap工程示意图
我们为UserPhone、UserName和Password填上具体的值,然后单击发消息的按钮,便开始了正式的对整个程序的测试。测试执行之后的软件界面如图8所示。
图8 测试执行之后的软件界面
从图8中我们可以看到,开户流程执行成功。
为了对程序进行全面的测试,可以设置多组测试用例。
以上便是基于SOAP协议的总体开发流程,具体的编程细节取决于大家所参与的项目的实际情况,但基本的流程都是一致的。
四、总结
本文基于作者的实际开发经历,对SOAP协议和基于SOAP的开发流程进行了详细的说明,供从事相关开发的朋友们参考。
在整个开发的过程中,我们要注意以下几点:
第一,wsdl文件的编写至关重要,这相当于是内部系统与用户之间的协议。在编写代码之前,大家一定要将协议弄清楚,以免后期修改所带来的麻烦。
第二,在对代码进行测试的时候,大家一定要详细阅读程序所产生的日志和数据库中的相关数据,确保每个处理流程的执行都是正确无误的。
第三,一定要与用户约定好执行之后的相关结果码(即resultcode的值),哪些值表示执行成功,哪些值表示执行失败,都要考虑好。这样也方便查找程序问题。
第四,对于不同的soapUI的版本,对未填写的字段的处理会有所不同。有些版本的soapUI会将未填写的字段当成空指针来处理,大家在编写代码的时候要特别注意。
欢迎大家关注并支持本人新书《C程序员从校园到职场》。