SOAP是我们Web Service中很常见的一个协议,SOAP确定了一种通过XML实现跨语言、跨机器传输调用的协议,WSDL更像是所提供服务的一个规范、一个文档,本篇文章介绍梳理一下他们的规则与逻辑,更好的认识一下SOAP协议及WSDL描述文件。

SOAP简单对象访问协议

SOAP(Simple Object Access Protocol)简单对象访问协议是交换数据的一种规范,在Web Service中,交换带结构信息。可基于HTTP等协议,使用XML格式传输,抽象于语言实现、平台和硬件。即多语言包括PHP、Java、.Net均可支持。

优点是跨语言,非常适合异步通信和针对松耦合的C/S,缺点是必须做很多运行时检查。

相关概念

SOAP封装(envelop),定义了一个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理。

SOAP编码规则(encoding rules),定义了一种序列化的机制,表示应用程序需要使用的数据类型的实例。

SOAP RPC表示(RPC representation),定义了一个协定,用于表示远程过程调用和应答。

SOAP绑定(binding),定义了SOAP使用哪种协议交换信息。使用HTTP/TCP/UDP协议都可以。

基本结构

示例:

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

...

...

...

...

...

...

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

...

...

...

...

...

...

一条SOAP消息就是一个普通的XML文档,Envelope元素与Body元素(包含调用和响应信息)必须存在,Header元素(包含头部信息)和Fault元素(提供有关在处理此消息所发生的错误的信息)可以作为可选存在

SOAP Envelope元素

SOAP消息的根元素,可把XML文档定义为SOAP消息

命名空间

xmlns:SOAP命名空间,固定不变。

SOAP在默认命名空间中定义了3个属性:actor,mustUnderstand,encodingStyle。这些被定义在SOAP头部的属性可定义容器如何对SOAP消息进行处理。

mustUnderstand属性——用于标识标题项对其进行处理的接受者来说是强制的还是可选的。(0可选1强制)soap:mustUnderstand="0/1"

SOAP的actor属性可用于将Header元素寻址到一个特定的端点 soap:actor="URI"

SOAP的encodingStyle属性用于定义在文档中使用的数据类型。此属性可出现在任何SOAP元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP消息没有默认的编码方式。soap:encodingstyle="URI"

SOAP Header元素

可选的SOAP Header元素可包含有关SOAP消息的应用程序专用信息。如果Header元素被提供,则它必须是Envelope元素的第一个子元素

soap:mustUnderstand="1">234 #表示处理此头部的接受者必须认可此元素,假如此元素接受者无法认可此元素,则在处理此头部时必须失效

1

2

3

4

5

6

soap:mustUnderstand="1">234#表示处理此头部的接受者必须认可此元素,假如此元素接受者无法认可此元素,则在处理此头部时必须失效

SOAP Body元素

必须的SOAP Body元素可包含打算传送到消息最终端点的实际SOAP消息。SOAP Body元素的直接子元素可以使合格的命名空间

SOAP Fault元素

用于存留SOAP消息的错误和状态消息,可选的SOAP Fault元素用于指示错误消息。如果已提供了Fault元素,则它必须是Body元素的子元素,在一条SOAP消息中,Fault元素只能出现一次。

SOAP Fault子元素:

供识别障碍的代码

可供人阅读的有关障碍的说明

有关是谁引发故障的信息

存留涉及Body元素的应用程序的专用错误信息

faultcode值描述:

versionMismatch SOAP Envelope的无效命名空间被发现

mustUnderstand Header元素的一个直接子元素(mustUnderstand=”1′)无法被理解

Client 消息被不正确的构成,或包含不正确的信息

Server 服务器有问题,因此无法处理进行下去

WSDL网络服务描述语言

WSDL(Web Services Description Language)网络服务描述语言,WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web Service。

基本结构

definition of types........

definition of a message....

definition of a port.......

definition of a binding....

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

definitionoftypes........

definitionofamessage....

definitionofaport.......

definitionofabinding....

一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、service元素。这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素。

特定实例剖析

以盛付通的一个接口为例,介绍一下整个wsdl描述文件,网址如下http://cardpay.shengpay.com/api-acquire-channel/services/receiveOrderService?wsdl

Types

数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。

.......

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

.......

Message

通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。

1

2

3

4

Operation & PortType

Operation 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。

PortType 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。

1

2

3

4

5

6

7

8

Binding

特定端口类型的具体协议和数据格式规范的绑定。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Port&Service

Port 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。

Service 相关服务访问点的集合。

1

2

3

4

5

6

PHP操作示例代码

//soap版本为1.1,不缓存wsdl文件

$options = array(

'trace'=>true,

'cache_wsdl'=>WSDL_CACHE_NONE,

'soap_version'=> SOAP_1_1

);

//上送参数

$request = array();//do something

//准备请求

$soapClient = new SoapClient($url, $options);

try {

$response = $soapClient->__soapCall($function, array(array('arg0'=>$request)));

if (is_object($response)) {

$responseArray = get_object_vars($response);

return $responseArray;

}

} catch (SOAPFault $e) {

//do something

} catch(Exception $e) {

//do something

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//soap版本为1.1,不缓存wsdl文件

$options=array(

'trace'=>true,

'cache_wsdl'=>WSDL_CACHE_NONE,

'soap_version'=>SOAP_1_1

);

//上送参数

$request=array();//do something

//准备请求

$soapClient=newSoapClient($url,$options);

try{

$response=$soapClient->__soapCall($function,array(array('arg0'=>$request)));

if(is_object($response)){

$responseArray=get_object_vars($response);

return$responseArray;

}

}catch(SOAPFault$e){

//do something

}catch(Exception$e){

//do something

}

小结

附wsdl示例全文:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

java soap wsdl 实例_SOAP与WSDL详解相关推荐

  1. java jtable组件_java中jtable组件详解实例

    java中jtable组件详解实例 java 表格控件 JTable 常用操作详解 JTable 是 Swing 编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一 ...

  2. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

  3. java 静态对象赋值_基于Java class对象说明、Java 静态变量声明和赋值说明(详解)...

    先看下JDK中的说明: java.lang.Object java.lang.Class Instances of the class Class represent classes and inte ...

  4. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  5. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  6. java swing 案例详解_《Java Swing图形界面开发与案例详解》PDF_IT教程网

    资源名称:<Java Swing图形界面开发与案例详解>PDF 内容简介: <Java Swing图形界面开发与案例详解>全书共20章,其中第1-2章主要介绍有关Swing的基 ...

  7. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  8. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  9. Java多线程实现跑步比赛【比赛详解】

    文章目录 文章链接 实现要求 比赛详解 文章链接 Java多线程实现跑步比赛[比赛详解] Java多线程实现跑步比赛[基本设计] Java多线程实现跑步比赛[RunMap--地图映射类] Java多线 ...

最新文章

  1. Mysql与Oracle区别
  2. c语言程序设计编辑与调试环境实验报告,01程序设计基础实验报告_C语言程序设计基础.doc...
  3. ResNext(2017)解读
  4. python的字典与集合
  5. javascript 开发_25个新JavaScript开发人员的免费资源
  6. dlp防泄密系统卸载_怎样做好数据防泄密?奥赛系统早知道
  7. 打开文件对话框的演练 c# 1614821885
  8. BZOJ3639 Query on a tree VII
  9. 小米解锁过程中验证失败怎么办,有什么处理方式
  10. CSS 文字样式 第二节
  11. 科技爱好者周刊(第 150 期):当音乐还是稀缺的时候
  12. 海思(六)如何在ubuntu20.04上搭建caffe环境
  13. python123新版个人所得税计算请输入正数_Python训练的数字组合,个人所得税计算,完全平方数,python,之...
  14. pdf打开错误之读取本文档时出现问题(14)
  15. Android进程保活、拉活方案
  16. please select a vaild python interpret
  17. DS二叉树——Huffman编码与解码(不含代码框架)
  18. 人工智能帮助千万用户完成「隐形征信」计算 1
  19. suse linux 11 xdm图形化,suse xdm 设置
  20. 散列表查找为何如此之快

热门文章

  1. 我的毕业设计---家庭点歌系统
  2. Android开发教程--第一个JNI程序
  3. 一个女孩喜欢上一个男性网友怎么办?
  4. ResNet(一)相关概念
  5. matlab hmm程序,HMM MATLAB Toolbox应用
  6. kali-Linux局域网渗透之Win2003
  7. 【电路原理学习笔记】第2章:电压、电流和电阻:2.5 电阻
  8. [linux]Linux下用vmware安装windows
  9. java骰子代码,java—骰子
  10. 【KNN分类】基于matlab模拟退火优化KNN、蝗虫算法优化KNN数据分类【含Matlab源码 2275期】