根据W3C定义,SOAP是什么
“ SOAP是一种轻量级协议,旨在在分散的分布式环境中交换结构化信息。 它使用XML技术来定义和扩展消息传递框架,从而提供可以在各种基础协议之间交换的消息构造。 该框架被设计为独立于任何特定的编程模型和其他特定于实现的语义。”
简单对象访问协议
- 类似于CORBA的IIOP和RMI的JRMP的有线协议
- XML用于数据编码–基于文本和二进制的协议
- 支持基于XML的RPC(远程过程调用)以简化现有RPC分配方案向基于SOAP的系统的迁移(请注意,由于引入了RMI,因此不再使用此方法。
任何Java / J2EE开发人员都必须了解SOAP的工作原理,因为这将使他们能够构建更好的与其他系统进行通信和集成的应用程序,这一点极为重要。 像其他任何基本原理一样,最好理解基本概念。
但是,在大多数时候,开发人员将使用高级API(JAX-WS)实现来构建这些服务,从而隐藏了SOAP的实际机制。
SOAP的特征
- 默认情况下,SOAP是无状态的,但最终可以用于进行有状态的事务(将状态数据传递给对象)。
- 单向消息交换范例:应用程序可以通过将这种单向交换与基础协议(http),特定于应用程序的信息和更高级别的标准(例如“ WS-Addressing”)所提供的功能相结合来创建更复杂的交互模式。
- SOAP对它传达的任何特定于应用程序的数据的语义都保持沉默。 它实际上并不关心哪种数据(XML只是一种建议,因为它是一种通用格式,这意味着任何平台都可以理解并可以解析这种结构)。
SOAP的设计目标
- 简单
- 可扩展性
- 尽管它确实提供了上述功能,但它不支持高级支持的分布式功能,例如分布式GC,按引用的对象,激活和消息批处理。
SOAP消息结构
SOAP邮件信封
- 嵌入式信息包括名称空间和编码信息
- 标头(可选)
- 身体(必填)–由接收者处理
SOAP标头(<env:header>)
- 用于扩展(上下文,身份验证,事务,管理)
- 由标题块组成(标题块的组成)
- 大多数Web服务标准活动基本上都是为特定域定义标准头条目。
SOAP标头块(条目)
- SOAP标头的子元素
- 专为防止各种用途的SOAP设计
- 由SOAP消息路径上遇到的SOAP节点检查,插入,删除或转发。
SOAP正文(<env:Body>)
- 车身块的组成
- SOAP接收者使用
- 携带端到端信息(XML,RPC方法和参数,SOAP Fault –异常)
- SOAP故障消息
故障信息
如果在通信过程中遇到任何错误或任何异常,则会将错误消息返回给客户端,以使其能够正常处理该问题。 有预定义的SOAP故障代码值。
- VersionMisMatch(版本不匹配的SOAP信封中的无效名称空间)
- MustUnderstand(接收器无法理解,因此无法处理mustUnderstand SOAP标头块)
- 客户端(客户端通信错误)
- 服务器(服务器端通信错误)
这可用于将任何可读异常返回给客户端。 这对创建Web服务的任何人都非常有用,并且必须做。
代码示例
除了概念之外,让我们深入研究代码示例。 我使用NetBeans创建了示例。
技术堆栈:带有Java / Java EE的NetBeans IDE,Glassfish应用服务器
如果您从NetBeans IDE 站点下载这些文件,则它们都捆绑在一起。
项目: 在此处下载。
Web服务
创建一个新的Web应用程序项目。
创建一个简单的Java类并#Annotate
@WebService
public class SampleWebService {
/**
* Show Message
* @param message
* @return
*/
@WebMethod
public String showMessage(String message){
return message;
}
}
将Web服务应用程序部署到Glassfish
使用“测试Web服务”选项测试Web服务
单击下面的测试后,将启动一个网页,使您可以测试实际的WebService方法。
您可以通过传递值并单击“ showMessage”按钮来测试实际服务。
您也可以从提供的链接访问WSDL文件。 您可以看到SOAP定义,名称空间和条目。
客户端
公开服务并不难,但是如果没有任何客户端使用它,它将是什么? 让我们构建一个实际上将调用Web服务的客户端。 NetBeans再次为我们提供了一种创建具有WSDL URL的存根和对象的工具。 允许用户专注于使用服务。
创建一个新的Java项目
在Java项目中创建一个新的Web服务客户端
NetBeans IDE具有创建Web服务客户端的强大功能。 给您的WSDL精美优美地创建必要的对象。
提供WSDL URL和您的集合。
客户可以使用的生成的源代码
从客户端呼叫Web服务
生成存根后,您现在可以从项目中调用它
/**
*
* @author alvinreyes
*/
public class SampleWebServiceClient {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println(showMessage("Hello"));
}
private static String showMessage(java.lang.String arg0) {
com.areyes.soap.sample.SampleWebServiceService service = new com.areyes.soap.sample.SampleWebServiceService();
com.areyes.soap.sample.SampleWebService port = service.getSampleWebServicePort();
return port.showMessage(arg0);
}
}
在运行客户端之前,先构建项目。 这将使您的项目能够识别新的Java类和包。
wsimport-client-SampleWebServiceService:
files are up to date
wsimport-client-generate:
Compiling 1 source file to /Users/alvinreyes/NetBeansProjects/SampleWebServiceClient/build/classes
compile-single:
run-single:
Hello
BUILD SUCCESSFUL (total time: 3 seconds)
您可以在此处下载实际项目
翻译自: https://www.javacodegeeks.com/2016/04/soap-web-services.html