浏览 7113 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-11-07
最后修改:2009-12-24
服务提供方先给了一个xsd文档,然后给了wsdl文档,接下来在网上好不容易实现方法来调用。 可是现在我要提供java的基于document/literal的webservice接口,要传入的参数也是xml文档内容组合成的字符串(而且是多条记录,可能将上千条记录一起传过来,避免多次调用接口影响性能和响应时间),所以就开始研究document/literal格式,不过没多少头绪,也有一些疑惑,希望能得到大家的帮助。 1.首先,我要根据传入的参数的类型定义xsd文档? 2.如果这样的话,我是不是要将接受的字符串先转化成xml文档并根据xsd来验证参数的合法性?请问如何实现?(最好给些code^_^) 接下来就好办了,就卡在这地方了。 也许问题很浅显,那就请顺便指点一下,否则我走不下去了 呵呵 难者不会,会者不难 ps:调用类似的接口方法也很难找,下面我将调用代码贴出来和大家共享 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-11-07
wsdl:
<definitions name="HelloWorld" targetNamespace="http://xmlns.oracle.com/HelloWorld" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:client="http://xmlns.oracle.com/HelloWorld" > <types> <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/HelloWorld" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="HelloWorldProcessRequest"> <complexType> <sequence> <element name="input" type="string"/> </sequence> </complexType> </element> <element name="HelloWorldProcessResponse"> <complexType> <sequence> <element name="result" type="string"/> </sequence> </complexType> </element> </schema> </types> <message name="HelloWorldRequestMessage"> <part name="payload" element="client:HelloWorldProcessRequest"/> </message> <message name="HelloWorldResponseMessage"> <part name="payload" element="client:HelloWorldProcessResponse"/> </message> <portType name="HelloWorld"> <operation name="process"> <input message="client:HelloWorldRequestMessage"/> <output message="client:HelloWorldResponseMessage"/> </operation> </portType> <binding name="HelloWorldBinding" type="client:HelloWorld"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="process"> <soap:operation style="document" soapAction="process"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="HelloWorld"> <port name="HelloWorldPort" binding="client:HelloWorldBinding"> <soap:address location="http://robin:9700/orabpel/default/HelloWorld/1.0"/> </port> </service> <plnk:partnerLinkType name="HelloWorld"> <plnk:role name="HelloWorldProvider"> <plnk:portType name="client:HelloWorld"/> </plnk:role> </plnk:partnerLinkType> </definitions> 2. 编写调用类,代码如下: import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import java.util.Vector; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.constants.Style; import org.apache.axis.message.SOAPBodyElement; import org.apache.xml.serialize.DOMSerializerImpl; import org.apache.xml.serialize.OutputFormat; import org.w3c.dom.Document; import org.w3c.dom.Element; public class BPELServiceTest { //service的命名空间 static final String ns = "http://xmlns.oracle.com/HelloWorld"; public static void main(String args[]){ Call call = null; try { call = createCall(); Vector rtn = (Vector) call.invoke(createRequest()); parse(rtn); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FactoryConfigurationError e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * 创建Call对象,对设置相关属性,注意:其中的属性应该是通过分析WSDL文件由程序动态获得来赋值, * 这里全部简化为静态赋值 */ static Call createCall() throws MalformedURLException, ServiceException{ org.apache.axis.client.Service s = new org.apache.axis.client.Service(); Call call = (Call) s.createCall(); call.setTargetEndpointAddress(new URL("http://robin:9700/orabpel/default/HelloWorld/1.0")); call.setSOAPActionURI("process"); call.setOperationName("process"); call.setProperty(Call.OPERATION_STYLE_PROPERTY, Style.DOCUMENT.getName()); call.setPortName(new QName(ns, "HelloWorldPort")); call.setPortTypeName(new QName(ns, "HelloWorld")); return call; } /* *创建请求参数,实际上就是构建DOM片断,根据Web service对输入参数的要求来构建,要多复杂,都可以实现, *这就是Docuemnt的好处,省去了复杂对象的序列化。 */ static Object[] createRequest() throws ParserConfigurationException, FactoryConfigurationError{ DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = db.newDocument(); Element root = doc.createElementNS(ns, "HelloWorldProcessRequest"); Element input = doc.createElementNS(ns, "input"); input.appendChild(doc.createTextNode("robin")); root.appendChild(input); doc.appendChild(root); return new Object[]{new SOAPBodyElement(root)}; } // 对返回结果进行解析,并打印。 static void parse(Vector v) throws Exception{ Document doc = ((SOAPBodyElement) v.get(0)).getAsDocument(); Element root = doc.getDocumentElement(); OutputFormat of = new OutputFormat(); of.setIndent(4); System.out.println(new DOMSerializerImpl().writeToString(root)); } } 上述代码运行输出结果为: <?xml version="1.0"?> <HelloWorldProcessResponse xmlns="http://xmlns.oracle.com/HelloWorld"> <result xmlns="http://xmlns.oracle.com/HelloWorld">robin</result> </HelloWorldProcessResponse> 上面的代码很简单,需要说明的是:采用Document调用,实际上invoke方法的参数是一个元素类型为SOAPBodyElement的对象数组,而返回结果是一个元素类型的SOAPBodyElement的Vector对象。 |
|
返回顶楼 | |
发表时间:2008-10-24
我有问题请教。。。怎么动态来获得wsdl 的值?
|
|
返回顶楼 | |