-
客户端用Document_literal方式调用web service问题10
折腾好几天了,实在是没辙了,小弟水平有限,大家帮忙看看吧。
开发环境:JDK1.5.06、tomcat5.5.26、j2ee1.4、axis1.4、
通过axis将服务类发布成webService,然后写客户端进行调用
服务类代码 Doc.java:public class Doc { public String say(String message,String mes2) { System.out.println("调用say方法了"); String a=message+mes2; System.out.println(a+"------------------------"); return a; } }
此类对应在server-config.wsdd文件中的代码:<service name="Doc" type="" provider="java:RPC" style="document" use="literal"> <parameter name="scope" value="Request"/> <parameter name="className" value="org.webservice.report.Doc"/> <parameter name="allowedMethods" value="*"/> <namespace>http://Doc</namespace>
启动tomcat后访问webservice地址其WSDL文件如下:<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://Doc" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://Doc" xmlns:intf="http://Doc" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!--WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)--> <wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://Doc" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="message" type="xsd:string"/> <element name="mes2" type="xsd:string"/> <element name="sayReturn" type="xsd:string"/> </schema> </wsdl:types> <wsdl:message name="sayResponse"> <wsdl:part element="impl:sayReturn" name="sayReturn"/> </wsdl:message> <wsdl:message name="sayRequest"> <wsdl:part element="impl:message" name="message"/> <wsdl:part element="impl:mes2" name="mes2"/> </wsdl:message> <wsdl:portType name="Doc"> <wsdl:operation name="say" parameterOrder="message mes2"> <wsdl:input message="impl:sayRequest" name="sayRequest"/> <wsdl:output message="impl:sayResponse" name="sayResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DocSoapBinding" type="impl:Doc"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="say"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="sayRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="sayResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="DocService"> <wsdl:port binding="impl:DocSoapBinding" name="Doc"> <wsdlsoap:address location="http://10.85.20.89:8080/s/services/Doc"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
客户端代码:org.apache.axis.client.Service s = new org.apache.axis.client.Service(); Call call = (Call) s.createCall(); call.setTargetEndpointAddress(new URL("http://10.85.20.89:8080/s/services/Doc")); call.setSOAPActionURI(""); call.setOperationName(new QName("http://Doc", "say")); call.setProperty(Call.OPERATION_STYLE_PROPERTY, Style.DOCUMENT.getName()); call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true)); SOAPBodyElement[] input = new SOAPBodyElement[2]; input[0] = new SOAPBodyElement(XMLUtils.StringToElement("http://Doc", "say", "1111")); input[1] = new SOAPBodyElement(XMLUtils.StringToElement("http://Doc", "say", "2222")); Vector rtn = (Vector) call.invoke(input); Element result=((SOAPBodyElement)rtn.get(0)); System.out.println(result.getFirstChild().getNodeValue());
客户端返回的结果应该将传入的2个参数返回即"11112222",但是返回的结果是"1111null";
也就是说服务类只获取到了第一个参数,第二个参数没有获取到。
通过工具监听到的SOAP消息以及返回结果结果如下:
请求:<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:say xmlns:ns1="http://Doc">1111</ns1:say> <ns2:say xmlns:ns2="http://Doc">2222</ns2:say> </soapenv:Body> </soapenv:Envelope>
返回结果:<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <sayReturn xmlns="http://Doc">1111null</sayReturn> </soapenv:Body> </soapenv:Envelope>
后来又用工具xmlSpy根据服务的地址自动生成SOAP请求调用服务,结果也是一样
请求:<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <m:message xmlns:m="http://Doc">String</m:message> <m:mes2 xmlns:m="http://Doc">String</m:mes2> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
返回结果:<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <messageReturn xmlns="http://Doc">Stringnull</messageReturn> </soapenv:Body> </soapenv:Envelope>
如果服务类对应在server-config.wsdd文件代码
由原来的 style="document" use="literal" 改为 style="rpc" use="encode"
则没有这样的问题。
如果传入的参数为一个也是没有问题的,如果是多个的话则除第一个外,其他的都为空。
在网上也找了些例子,用Document_literal方式调用web service,但是例子上的方法都是传入一个参数的,没有传多个的
难道没有人试过传多个参数的。
到一些英文网站上也有人说是JAX-RPC对Document_literal方式支持不太好,建议使用JAX-WS,但是要公司换高版本的JDK好像不太
现实。
另外就是由于要和别的系统做接口,通过wsdl来生成代码来调用的方式太笨拙了,这个就直接毙掉了。
大家帮忙看看有没好的办法,小弟在这里多谢了。
看样子是无人回答了,结贴吧,顺便说下我找到答案:
貌似是axis的问题,只要是document方式,则只能接收到一个参数,其余的参数都接收不到,
解决方法就是将方法的参数类型弄成个复杂类型,自己写一个javabean将方法参数都封装在里面
,最后在服务器端解析javabean。
但是在用JDK自带的注解将类发布为webservice就没有这样的问题,多个参数都可以接收得到。
2010年7月14日 11:28
目前还没有答案
相关推荐
标题中的“WebServices服务接口调用---用document方式应用”指的是使用XML文档作为消息交换格式来调用Web服务接口的一种方法。 在Web服务中,有两种主要的消息交换模式:RPC(Remote Procedure Call)风格和...
在Android开发中,调用Web Service是常见的数据交互方式,特别是在需要与远程服务器进行通信时。Web Service是一种基于网络的、平台无关的接口,可以提供数据交换和业务逻辑执行。本示例提供了Android客户端和服务器...
Web 服务描述语言(WSDL,Web Service Description Language)是一种XML格式,用于定义网络服务的接口,包括服务的位置、操作及如何与这些服务交互。在WSDL文档中,SOAP(Simple Object Access Protocol)绑定部分...
Web服务是一种基于网络的、平台无关的交互方式...客户端则使用Axis2的Document Literal风格,直接构造并发送SOAP消息,无需预先生成客户端存根。这种实现方式具有灵活性和跨平台性,使得不同系统间的通信变得更加便捷。
最后,客户端的创建涉及到了调用Web服务。这里创建了一个测试类,使用了Xfire提供的API来创建服务的元数据和服务代理。`ObjectServiceFactory`用于创建服务模型,`XFireProxyFactory`则用来创建服务代理对象。通过...
客户端调用远程Web服务的第一步是获取WSDL(Web Service Definition Language)文件,它定义了服务的接口和消息格式。使用CXF的`wsdl2java`工具,将WSDL文件转换为Java代码。以下是一些常用的`wsdl2java`命令行选项...
在客户端代码中,我们可以通过以下方式来调用Web服务的方法: ```java package com.dscomm.minhang.eoc.web.jaxws.client; public class WebServiceTest { public static void main(String[] args) { ...
- **服务代理**:使用`Service`类可以生成服务代理对象,这个对象可以调用Web服务的方法。`Service`类通常通过WSDL文档来实例化。 - **@WebParam**:用于定义方法参数,可以指定参数的名称和传递方式。 - **异常...
调用Web服务时,客户端需要使用SOAP消息与服务进行通信。Axis也提供了客户端API,使得开发者可以方便地创建这些SOAP消息,发送请求并处理响应。它支持各种传输协议,如HTTP和HTTPS,以及数据编码方式,如XML和JSON。...
一旦WSDL发布,客户端就可以使用它来生成代理类,进而调用我们的Web服务。 总的来说,使用Axis1.4发布doc/literal格式的Web服务涉及创建Java服务类、编写或编辑部署配置文件(如`server-config.wsdd`),并确保在...
通过以上步骤,你已经掌握了如何在MyEclipse9.0中开发、测试和调用Web Service的基本流程。无论是本地服务还是远程服务,MyEclipse都能提供便捷的工具支持,使得Web Service的开发更加高效和直观。记得检查和理解...
4. 客户端API:解释如何使用CXF生成客户端代码,以便于调用Web服务。 5. 自定义行为:探讨如何扩展CXF以实现特定的功能需求,如拦截器和转换器。 总的来说,这个教程集合为学习Java WebService提供了全面的资源,...
8. **生成客户端代码**: 使用JAX-WS,可以通过WSDL文件自动生成客户端代码,使得调用Web Service如同调用本地方法一样简单。在JDK 6中,可以使用`wsimport`工具从WSDL生成客户端所需的Java类和配置文件。 总结起来...
- Document/Literal Wrapped:每个操作都有一个单独的根元素,将参数包裹其中,增加了一层封装,使得消息结构更加清晰。 #### 数据抽象与松散与强类型数据 数据抽象是网络服务设计的关键,它涉及到如何在服务接口...
JAX-WS(Java API for XML Web Services)是一种用于开发基于XML的Web服务的Java API。它是JAX-RPC的后继者,提供了一种更简洁的方式来...通过这个目录,开发者可以逐步学会如何使用JAX-WS来创建、发布和调用Web服务。
总之,Apache CXF 提供了一种高效且灵活的方式来实现和使用 Web Service,使得开发者可以轻松地构建和集成分布式应用程序,尤其在云计算和微服务架构中发挥着关键作用。通过理解 Web Service 的基本概念、架构优势...
`document/literal`是最常见的选择,因为它提供了更好的互操作性,但需要通过`document/literal wrapped`方式解决操作名称的表示问题。 最后,我们来看看在WSDL中指定SoapAction的三种方式。SoapAction是一个HTTP头...
- 这些代码确保 Delphi 客户端使用 Document|Literal 编码方式与 .NET 2.0 的 WebService 通信。 4. **调用 WebService 方法**: - 在实际的业务代码中,可以通过如下方式调用 WebService 中的方法: ```pascal ...