2007-11-07
如何提供java的基于document/literal的webservice接口
关键字: soap 接口 document literal
以前曾经调用过.NET发布的webservice接口,document/literal格式的,传入的参数是xml文档内容组合成的字符串,当时对这种方式还不是很了解。
服务提供方先给了一个xsd文档,然后给了wsdl文档,接下来在网上好不容易实现方法来调用。
可是现在我要提供java的基于document/literal的webservice接口,要传入的参数也是xml文档内容组合成的字符串(而且是多条记录,可能将上千条记录一起传过来,避免多次调用接口影响性能和响应时间),所以就开始研究document/literal格式,不过没多少头绪,也有一些疑惑,希望能得到大家的帮助。
1.首先,我要根据传入的参数的类型定义xsd文档?
2.如果这样的话,我是不是要将接受的字符串先转化成xml文档并根据xsd来验证参数的合法性?请问如何实现?(最好给些code^_^)
接下来就好办了,就卡在这地方了。
也许问题很浅显,那就请顺便指点一下,否则我走不下去了 呵呵
难者不会,会者不难
ps:调用类似的接口方法也很难找,下面我将调用代码贴出来和大家共享
服务提供方先给了一个xsd文档,然后给了wsdl文档,接下来在网上好不容易实现方法来调用。
可是现在我要提供java的基于document/literal的webservice接口,要传入的参数也是xml文档内容组合成的字符串(而且是多条记录,可能将上千条记录一起传过来,避免多次调用接口影响性能和响应时间),所以就开始研究document/literal格式,不过没多少头绪,也有一些疑惑,希望能得到大家的帮助。
1.首先,我要根据传入的参数的类型定义xsd文档?
2.如果这样的话,我是不是要将接受的字符串先转化成xml文档并根据xsd来验证参数的合法性?请问如何实现?(最好给些code^_^)
接下来就好办了,就卡在这地方了。
也许问题很浅显,那就请顺便指点一下,否则我走不下去了 呵呵
难者不会,会者不难
ps:调用类似的接口方法也很难找,下面我将调用代码贴出来和大家共享
评论
coolyzg
2007-11-07
wsdl:
2. 编写调用类,代码如下:
上述代码运行输出结果为:
<?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对象。
<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对象。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 28784 次
- 性别:

- 来自: 南京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Cron表达式
...
-- by jianpingyu -
Hibernate Annotations 实 ...
问 为什么我导入了ejb3-persistence.jar,hibernate- ...
-- by zhanglingsi -
如何提供java的基于docume ...
wsdl: <definitions name="HelloW ...
-- by coolyzg -
警报响了!!
叶子 写道麻木的结局就是 人人手里有票,可就是不投自己想要的,投完了私下在破口 ...
-- by ajooTrustno1 -
警报响了!!
hurricane1026 写道ajooTrustno1 写道叶子 写道基层不是 ...
-- by ajooTrustno1






评论排行榜