- Web Service的调用的本质:
(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控制;
(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是实现类!
希望对你有帮助,祝你有一个好心情,加油!
若有错误、不全、可优化的点,欢迎纠正与补充;转载请注明出处!