由于现在WebService服务,用的最多的是http协议,最近研究了下soap协议(带请求头)报文的请求,以此总结一下写个笔记忘日后观看,有说的不对的地方请大家指出来,虚心讨教。
话不多说直接上干货。
1.首先我就用最简单的方式,jdk自带的webService发布服务。
1.1:准备工作,写一个接口,一个实现类,加一个测试类用来发布服务。截图如下:
接口截图:
实现类截图:

发布测试类截图:
简述:
@WebParam(name="USERS") Users user1 -------这个注解是指定接受报文的body信息名字为USERS的参数,如果不写系统会默认比如:arg0;
@WebParam(header = true, name = "auth") HisCallHeader user ------这个注解和上面有所不同是多了个header参数的设置,当header=true时时代表在报文的头信息中接受名字为auth的,如果不写则接受不到头信息的内容,同理不指定名字的话会系统会默认一个名字,在这里我们所有的接受参数都设置一个指定的名字,这样在实际项目中更加清晰明了。
@WebParam(header = true,name="parameter") HisCallParameter in) -----同上
@WebService(targetNamespace = "http://www.webser.com") -------这个targetNamespace参数可以不写,默认为当前类的包名,这里我们给它命名一个名字稍后我会解释下命名之后的好处,这里的命名可以随便写没什么限制,但大多数都会用http://*******,这样命名。
实际操作开始:使用eclispe中的自带的WebService工具去访问我的服务,
讲道理这个工具真的很好可以方便我们查看soap报文的格式:
(由于SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议,
1.1:命名空间部分:
1.2:头部信息部分
1.3:body身体部分:
*****重点讲一个头部部分,因为这块容易出问题:
<ns:auth xmlns:ns="http://www.webser.com">
(我们自定义的命名空间以这种方式)
<q0:parameter>
(引用soap中报文最上部分的q0命名空间,也就是服务端规定的)
说一下上面这两个参数,里面那些参数是类里面的属性,我们就不多说了,这里面我只说实体类
其中auth,parameter这两个名字是我为两个实体类起的接受时指定的名字。
1.前面我说过如果我在编写WebService服务端的时候如果不写命名空间的会某人为包名,写的话系统会在soap报文中的命名空间处显示的是我们所命名的空间名 如下图:
详解:回过头来继续说,当我的参数引用这个服务器端规定的命名空间时我才会接收到,如果不是该命名空间则接受不到信息,而是为null,那么这个时候就会有人问上述头部信息中的这两个参数为什么不都引用“q0”这个我们服务端指定好的命名空间名字,为什么还用我们自定义一个命名空间,我个人理解哦一个报文如果由多个服务端读取的话,这样就便于根据命名空间去接受,这个根据命名空间名称服务端去选择接受那个参数。
我上述截图中头信息参数名字为“auth“它是我自定义的命名空间,但是我命名的名字适是和"q0"是一样的所以服务端可以接受到它,如果不一样我改成别的,跟服务端的命名空间不一样,那么服务端接收不到此信息。
下面简单提及一下body(身体部分)的有人会问“<q0:hiscall>"这块可不可以自定义命名一个呢,这块这个"hiscall“它是我们服务端的方法名称,这个方法里面接受头部的参数,body中的参数,如果和更改了命名空间,那个我们还如何访问该方法,又如何去取的参数,所以这块命名空间建议和系统一样(如果大家更改过可以使用那么请留言告诉我,我也学习一下,目前经常尝试仅仅了解这样);
服务端的返回值:
服务端接口以及实体类返回值什么都是可以字符串对象啦等等,而我用的是httpURLConnection,用输出流发送的字符串拼接的soap报文。
接受的是用输入流接受的拼接成字符串,你会发现这个字符串是soap响应报文,如果想取的里面的信息,就是dom解析xml节点的方式来获取即可。稍后我会贴出代码,大家参考下。
==========================================================================
服务端代码展示:
1.服务端接口
package abc;
<