首页 > 编程知识 正文

java soap协议,soap协议优点

时间:2023-05-06 03:02:56 阅读:62689 作者:202

【文章摘要】

简单对象访问协议(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消息
该处理流程的伪代码如下:

soap_init(&soap); // 初始化soapm = soap_bind(&soap, IpAdr, Port, BACKLOG); // 绑定IP和端口号while (!soap_valid_socket(m)) // 循环直至服务套接字合法{ m = soap_bind(&soap, IpAdr, Port, BACKLOG);}……for (;;) // 用一个死循环来不停地接收SOAP消息{ s = soap_accept(&soap); // 接收到SOAP消息 if (!soap_valid_socket(s)) // 对错误消息的处理 { …… } // 将接收到的SOAP消息放入队列供处理线程处理 EnQueue(data); }

(2)处理SOAP消息
该处理流程的伪代码如下:

for (;;) // 用一个死循环来不停地处理SOAP消息{ DeQueue(&data); // 将SOAP消息从队列中取出来处理 …… soap_set_namespaces(tsoap, namespaces); // 设置命名空间 soap_serve(tsoap); // 具体处理SOAP消息的函数 soap_destroy(tsoap); // 处理完成之后,销毁该SOAP消息 soap_end(tsoap); // 结束本次处理}

(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程序员从校园到职场》。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。