﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-robin-随笔分类-Web service</title><link>http://www.blogjava.net/robin/category/6613.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 20:36:45 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 20:36:45 GMT</pubDate><ttl>60</ttl><item><title> JavaScript调用Web service</title><link>http://www.blogjava.net/robin/archive/2006/01/05/26773.html</link><dc:creator>人生是由回忆组成的</dc:creator><author>人生是由回忆组成的</author><pubDate>Thu, 05 Jan 2006 12:01:00 GMT</pubDate><guid>http://www.blogjava.net/robin/archive/2006/01/05/26773.html</guid><wfw:comment>http://www.blogjava.net/robin/comments/26773.html</wfw:comment><comments>http://www.blogjava.net/robin/archive/2006/01/05/26773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robin/comments/commentRss/26773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robin/services/trackbacks/26773.html</trackback:ping><description><![CDATA[<DIV class=comText>要调用的Web服务是求两个整数和，并返回结果。<BR><BR>服务的WSDL文件内容如下：<BR>
<DIV class=xoopsCode><CODE><PRE>&lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;wsdl:definitions
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:s="http://www.w3.org/2001/XMLSchema" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:tns="http://tempuri.org/"  
    xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
    targetNamespace="http://tempuri.org/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"&gt;
  &lt;wsdl:types&gt;
     &lt;s:schema elementFormDefault="qualified"  
        targetNamespace="http://tempuri.org/"&gt;
        &lt;s:element name="AddTwoIntegers"&gt;
            &lt;s:complexType&gt;
               &lt;s:sequence&gt;  
                  &lt;s:elementminOccurs="1" maxOccurs="1" name="IntegerOne" type="s:int" /&gt;    
                  &lt;s:elementminOccurs="1" maxOccurs="1" name="IntegerTwo" type="s:int" /&gt;   
               &lt;/s:sequence&gt;
            &lt;/s:complexType&gt;
        &lt;/s:element&gt;
        &lt;s:element name="AddTwoIntegersResponse"&gt;
            &lt;s:complexType&gt;
                &lt;s:sequence&gt; 
                   &lt;s:elementminOccurs="1" maxOccurs="1" name="AddTwoIntegersResult" type="s:int" /&gt;    
                &lt;/s:sequence&gt;
            &lt;/s:complexType&gt;
        &lt;/s:element&gt;
     &lt;/s:schema&gt;
  &lt;/wsdl:types&gt;
  &lt;wsdl:message name="AddTwoIntegersSoapIn"&gt; 
      &lt;wsdl:part name="parameters" element="tns:AddTwoIntegers" /&gt;
  &lt;/wsdl:message&gt;
  &lt;wsdl:message name="AddTwoIntegersSoapOut"&gt;  
      &lt;wsdl:part name="parameters" element="tns:AddTwoIntegersResponse" /&gt;   
   &lt;/wsdl:message&gt;
   &lt;wsdl:portType name="SimpleServiceSoap"&gt;
       &lt;wsdl:operation name="AddTwoIntegers"&gt;
          &lt;wsdl:input message="tns:AddTwoIntegersSoapIn" /&gt;
          &lt;wsdl:output message="tns:AddTwoIntegersSoapOut" /&gt;    
       &lt;/wsdl:operation&gt; 
   &lt;/wsdl:portType&gt;

   &lt;wsdl:binding name="SimpleServiceSoap" type="tns:SimpleServiceSoap"&gt; 
       &lt;soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /&gt; 
       &lt;wsdl:operation name="AddTwoIntegers"&gt;   
           &lt;soap:operation soapAction="http://tempuri.org/AddTwoIntegers" style="document" /&gt; 
           &lt;wsdl:input&gt;  
               &lt;soap:body use="literal" /&gt;    
           &lt;/wsdl:input&gt;
           &lt;wsdl:output&gt;  
               &lt;soap:body use="literal" /&gt;    
           &lt;/wsdl:output&gt;
       &lt;/wsdl:operation&gt;
  &lt;/wsdl:binding&gt;
  &lt;wsdl:service name="SimpleService"&gt; 
      &lt;documentation xmlns="http://schemas.xmlsoap.org/wsdl/" /&gt; 
      &lt;wsdl:port name="SimpleServiceSoap" binding="tns:SimpleServiceSoap"&gt;  
          &lt;soap:address location="http://localhost/Develop.NET/Home.Develop.WebServices/SimpleService.asmx"/&gt;  
      &lt;/wsdl:port&gt;  
  &lt;/wsdl:service&gt; 
&lt;/wsdl:definitions&gt;
</PRE></CODE></DIV><BR><BR>javaScript代码中利用了MS的HTTP代理对象XMLHTTP,在Mozilla's Web brower中相应的组件是XMLHttpRequest,他们都提供了类似的方法来完成soap请求。下面的代码用的是IE中的XMLHTTP对象。代码假定调用过程中没有Fault。<BR>
<DIV class=xoopsCode><CODE><PRE>function fncAddTwoIntegers(a, b)
{    
    var oXmlHttp = new ActiveXObject("MSXML2.XMLHTTP");      
    oXmlHttp.open("POST", "http://localhost/Develop.NET/Home.Develop.WebServices/SimpleService.asmx'", false);
    oXmlHttp.setRequestHeader("Content-Type", "text/xml");    
    oXmlHttp.setRequestHeader("SOAPAction", "http://tempuri.org/AddTwoIntegers");

    oXmlHttp.send("      <BR>     &lt;soap:Envelopexmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
        xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
        xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'&gt;   <BR>      &lt;soap:Body&gt;   
         &lt;AddTwoIntegersxmlns='http://tempuri.org/'&gt;      
            &lt;IntegerOne&gt;" + a + "&lt;/IntegerOne&gt; 
            &lt;IntegerTwo&gt;" + b + "&lt;/IntegerTwo&gt;    
         &lt;/AddTwoIntegers&gt; <BR>      &lt;/soap:Body&gt; 
     &lt;/soap:Envelope&gt;"); 
   
    return oXmlHttp.responseXML.selectSingleNode("//AddTwoIntegersResult").text;
}</PRE></CODE></DIV><BR><BR>原文英文出自：<A href="http://builder.com.com/5100-6371_14-5887775.html?tag=nl.e601" target=_blank>http://builder.com.com/5100-6371_14-5887775.html?tag=nl.e601</A></DIV><img src ="http://www.blogjava.net/robin/aggbug/26773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robin/" target="_blank">人生是由回忆组成的</a> 2006-01-05 20:01 <a href="http://www.blogjava.net/robin/archive/2006/01/05/26773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Document/literal方式调用web service</title><link>http://www.blogjava.net/robin/archive/2006/01/02/26385.html</link><dc:creator>人生是由回忆组成的</dc:creator><author>人生是由回忆组成的</author><pubDate>Mon, 02 Jan 2006 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/robin/archive/2006/01/02/26385.html</guid><wfw:comment>http://www.blogjava.net/robin/comments/26385.html</wfw:comment><comments>http://www.blogjava.net/robin/archive/2006/01/02/26385.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/robin/comments/commentRss/26385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robin/services/trackbacks/26385.html</trackback:ping><description><![CDATA[<DIV class=comText>Document方式是Web service缺省调用模式，和literal相组合，给我们调用Web service提供了极大的便利，省去了RPC调用方式的复杂类型序列化的问题，所以，Doucment调用方式在BPEL领域应用非常广泛，下面介绍基于Axis利用Document方式来调用一个Web service.<BR><BR>1. Web service准备：<BR>Web service你可以任意实现一个，我是利用Oracle BPEL,通过建立一个BPEL流程，然后把它发布为Web service(具体创建过程省略），这里重要的是Web service的WSDL文件，这是我们调用的门户。<BR>下面是我的Web service的WSDL文件内容：<BR>
<DIV class=xoopsCode><CODE><PRE>&lt;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"
    &gt;
    &lt;types&gt;
        &lt;schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/HelloWorld"
             xmlns="http://www.w3.org/2001/XMLSchema"&gt;
            &lt;element name="HelloWorldProcessRequest"&gt;
                &lt;complexType&gt;
                    &lt;sequence&gt;
                        &lt;element name="input" type="string"/&gt;
                    &lt;/sequence&gt;
                &lt;/complexType&gt;
            &lt;/element&gt;
            &lt;element name="HelloWorldProcessResponse"&gt;
                &lt;complexType&gt;
                    &lt;sequence&gt;
                        &lt;element name="result" type="string"/&gt;
                    &lt;/sequence&gt;
                &lt;/complexType&gt;
            &lt;/element&gt;
        &lt;/schema&gt;
    &lt;/types&gt;
    &lt;message name="HelloWorldRequestMessage"&gt;
        &lt;part name="payload" element="client:HelloWorldProcessRequest"/&gt;
    &lt;/message&gt;
    &lt;message name="HelloWorldResponseMessage"&gt;
        &lt;part name="payload" element="client:HelloWorldProcessResponse"/&gt;
    &lt;/message&gt;
    &lt;portType name="HelloWorld"&gt;
        &lt;operation name="process"&gt;
            &lt;input message="client:HelloWorldRequestMessage"/&gt;
            &lt;output message="client:HelloWorldResponseMessage"/&gt;
        &lt;/operation&gt;
    &lt;/portType&gt;
    &lt;binding name="HelloWorldBinding" type="client:HelloWorld"&gt;
        &lt;soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/&gt;
        &lt;operation name="process"&gt;
            &lt;soap:operation style="document" soapAction="process"/&gt;
            &lt;input&gt;
                &lt;soap:body use="literal"/&gt;
            &lt;/input&gt;
            &lt;output&gt;
                &lt;soap:body use="literal"/&gt;
            &lt;/output&gt;
        &lt;/operation&gt;
    &lt;/binding&gt;
    &lt;service name="HelloWorld"&gt;
        &lt;port name="HelloWorldPort" binding="client:HelloWorldBinding"&gt;
            &lt;soap:address location="http://robin:9700/orabpel/default/HelloWorld/1.0"/&gt;
        &lt;/port&gt;
    &lt;/service&gt;
  &lt;plnk:partnerLinkType name="HelloWorld"&gt;
    &lt;plnk:role name="HelloWorldProvider"&gt;
      &lt;plnk:portType name="client:HelloWorld"/&gt;
    &lt;/plnk:role&gt;
  &lt;/plnk:partnerLinkType&gt;

&lt;/definitions&gt;</PRE></CODE></DIV><BR><BR>2. 编写调用类,代码如下：<BR>
<DIV class=xoopsCode><CODE><PRE>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();
		}

	}

      /*<BR>       * 创建Call对象，对设置相关属性，注意：其中的属性应该是通过分析WSDL文件由程序动态获得来赋值，<BR>       * 这里全部简化为静态赋值<BR>       */
	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;
	}

      /*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*创建请求参数，实际上就是构建DOM片断，根据Web service对输入参数的要求来构建，要多复杂，都可以实现，<BR>       *这就是Docuemnt的好处，省去了复杂对象的序列化。<BR>       */
	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));
	}
}
</PRE></CODE></DIV><BR><BR>上述代码运行输出结果为：<BR>
<DIV class=xoopsCode><CODE><PRE>&lt;?xml version="1.0"?&gt;
&lt;HelloWorldProcessResponse xmlns="http://xmlns.oracle.com/HelloWorld"&gt;
   &lt;result xmlns="http://xmlns.oracle.com/HelloWorld"&gt;robin&lt;/result&gt;
  &lt;/HelloWorldProcessResponse&gt;
</PRE></CODE></DIV><BR><BR>上面的代码很简单，需要说明的是：采用Document调用，实际上invoke方法的参数是一个元素类型为SOAPBodyElement的对象数组，而返回结果是一个元素类型的SOAPBodyElement的Vector对象。</DIV><img src ="http://www.blogjava.net/robin/aggbug/26385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robin/" target="_blank">人生是由回忆组成的</a> 2006-01-02 22:09 <a href="http://www.blogjava.net/robin/archive/2006/01/02/26385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>