关于webservice接口document形式的调用


用Document/literal方式调用web service
Document方式是Web service缺省调用模式,和literal相组合,给我们调用Web service提供了极大的便利,省去了RPC调用方式的复杂类型序列化的问题,所以,Doucment调用方式在BPEL领域应用非常广泛,下面介绍基于Axis利用Document方式来调用一个Web service.

1. Web service准备:
Web service你可以任意实现一个,我是利用Oracle BPEL,通过建立一个BPEL流程,然后把它发布为Web service(具体创建过程省略),这里重要的是Web service的WSDL文件,这是我们调用的门户。
下面是我的Web service的WSDL文件内容:

    
        
            
                
                    
                        
                    
                
            
            
                
                    
                        
                    
                
            
        
    
    
        
    
    
        
    
    
        
            
            
        
    
    
        
        
            
            
                
            
            
                
            
        
    
    
        
            
        
    
  
    
      
    
  



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));
	}
}


上述代码运行输出结果为:

   robin
  

你可能感兴趣的:(wesevice)