CXF-07: CXF 的本质,解析 SOAP 文档

 - Web Service的调用的本质:

        (1)客户端把需要调用的参数,转换为XML文档片段(SOAP消息,input);

        (2)客户端通过网络把XML文档片段传给远程服务器;
        (3)服务器接收XML文档片段;
        (4)服务器解析XML文档片段,提取其中的数据,并把数据转换为调用所需的参数;
        (5)服务器执行方法;
        (6)得到方法返回值,服务器把方法返回值,转换为XML文档片段(SOAP消息,output);
        (7)服务器通过网络把XML文档片段传给远程客户端;
        (8)客户端接收XML文档片段;
        (9)客户端解析XML文档片段,提取其中的数据,并把数据转换为调用返回值;
 - Web Service的三个技术基础:
        - WSDL
                Web Service接口
                        1 . types元素(标准的Schema)
                        2 . 2N个message元素
                        3 . portType元素 - N个operation
                Web Service实现
                        1 . binding元素 - N个更详细的operation
                        2 . service元素 - 指定Web Service的服务地址
        - SOAP
                Header元素
                        Header元素不是强制出现的,由程序员控制添加;
                Body元素
                        Body元素总是默认的。Body元素里有两种情况:
                        ——当Web Service交互正确时,Body元素里的内容由WSDL控制;

                        ——当Web Service交互出错时,Body元素的内容将是Fault子元素;

         

        

         

        1 . 如果调用正确(Web Service交互成功),Body元素的内容应该遵守WSDL所要求的格式。

传入消息Inbound Message:
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
	<S:Body>
		<ns2:getAllFoods xmlns:ns2="http://ws.cxf.fjava.org/"/>
	</S:Body>
</S:Envelope>
传出消息Outbound Message:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<ns2:getAllFoodsResponse xmlns:ns2="http://ws.cxf.fjava.org/">
			<return>
				<entries>
					<key>蟹王汉堡</key>
					<value>
						<describe>橙色,亮金色,我的宝贝,我的爱!</describe>
						<id>3</id>
						<name>蟹王汉堡</name>
					</value>
				</entries>
				<entries>
					<key>海绵金币</key>
					<value>
						<describe>吃着金币样的甜甜饼,想着海绵宝宝赚的钱被扣了,哈哈哈,爽气!</describe>
						<id>4</id>
						<name>海绵金币</name>
					</value>
				</entries>
				<entries>
					<key>一个汉堡</key>
					<value>
						<describe>是三层的,有夹层哦!</describe>
						<id>1</id>
						<name>一个汉堡</name>
					</value>
				</entries>
				<entries>
					<key>火腿肠</key>
					<value>
						<describe>这是章鱼哥从岸上偷运来的,据说很美味!</describe>
						<id>2</id>
						<name>火腿肠</name>
					</value>
				</entries>
			</return>
		</ns2:getAllFoodsResponse>
	</soap:Body>
</soap:Envelope>
         2 . 若调用错误(Web Service交互出错),Body元素的内容就是Fault子元素

调用结果:http://192.168.0.159:6786/sayHello
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<soap:Fault>
			<faultcode>soap:Server</faultcode>
			<faultstring>
					No such operation: (HTTP GET PATH_INFO: /sayHello)
			</faultstring>
		</soap:Fault>
	</soap:Body>
</soap:Envelope>
调用错误:下面异常不是服务端异常,是想调用这个操作,没有这个操作
警告: Interceptor for {http://impl.ws.cxf.fjava.org/}HelloWorldWs has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No such operation:  (HTTP GET PATH_INFO: /sayHello)
	at org.apache.cxf.interceptor.URIMappingInterceptor.handleMessage(URIMappingInterceptor.java:88)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:118)
	at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:318)
	at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:286)
	at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:939)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:247)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
	at org.eclipse.jetty.server.Server.handle(Server.java:346)
	at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:589)
	at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:1048)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:601)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:214)
	at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:411)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:535)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:529)
	at java.lang.Thread.run(Thread.java:745)

        对比WSDL发现,SOAP(Simple Object Access Protocol - 简单对象协议)实际就是WSDL(Web Service Definition Language  - Web Service 定义语言)传入消息、传出消息的具体实现,好比是WSDL是接口,SOAP是实现类!

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充;转载请注明出处!



猜你喜欢

转载自blog.csdn.net/cheng_feng_xiao_zhan/article/details/52877647
CXF