saop_扫频 - CSDN
精华内容
参与话题
  • SAOP 学习笔记

    2018-07-14 16:41:35
    为什么需要SAOP?为了满足:应用具有广泛的兼容能力,可以支持不同的系统平台、数据格式和多种连接方式,要求在Internet 环境下,实现系统是松散耦合的、跨平台的,与语言无关的,与特定接口无关的,而且要提供对Web ...

    为什么需要SAOP?

    为了满足:应用具有广泛的兼容能力,可以支持不同的系统平台、数据格式和多种连接方式,要求在Internet 环境下,实现系统是松散耦合的、跨平台的,与语言无关的,与特定接口无关的,而且要提供对Web 应用程序的可靠访问。


    什么是SAOP?

    1.SAOP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分

        (1.)SAOP封装(envelop):封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它们的框架

        (2.)SAOP编码规则(encoding rules):用于表示应用程序需要使用的数据类型的实例

        (3.)SAOP RPC表示(RPC representation):表示远程过程调用和应答的协定

        (4.)SAOP绑定(binding):使用底层协议交换信息


    SAOP=RPC+HTTP+XML

    SOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC作为一致性的调用途径,XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在INTERNET进行通讯交互。



    客服端请时,不管对方客服端是什么平台的,首先把请求转换为XML格式,SOAP网关可以自动执行这个转换。为了保证传参、方法名、返回值的唯一性,SOAP协议使用了一个私有标记表,从而服务端的SAOP网关可以正确的解析。

    转换成XML格式后,SAOP终端名(远程调用方法名)及其他的一些协议标识被封装成HTTP请求,然后发送给服务器。如果应用程序要求,服务器返回一个HTTP应答信息给客户端。(与通常对HTML页面的HTTP GET请求不同的是,此请求设置了一些HTTP HEADER,标识着一个SOAP服务激发,和HTTP包一起传送。)








    展开全文
  • SAOP请求

    2019-08-01 01:04:04
    SOAP请求工具类 package xxx.util; import javax.xml.namespace.QName; import javax.xml.soap.MimeHeaders; import javax.xml.soap.SOAPConnectionFactory; import javax.xml.soap....import jav...

    SOAP请求工具类

    package xxx.util;
     
    import javax.xml.namespace.QName;
    import javax.xml.soap.MimeHeaders;
    import javax.xml.soap.SOAPConnectionFactory;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPConnection;
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.soap.SOAPPart;
    import javax.xml.soap.SOAPEnvelope;
    import javax.xml.soap.SOAPHeader;
    import javax.xml.soap.SOAPBody;
    import javax.xml.soap.SOAPBodyElement;
    import javax.xml.soap.SOAPHeaderElement;
    import javax.xml.soap.Name;
    import javax.xml.soap.SOAPElement;
    import javax.xml.ws.Dispatch;
    import javax.xml.ws.Service;
    import javax.xml.ws.Service.Mode;
    import javax.xml.ws.soap.SOAPBinding;
     
    import java.net.URL;
    import java.util.Map;
    import java.util.Set;
     
    import javax.activation.DataHandler;
     
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
     
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.stream.StreamResult;
     
    import org.w3c.dom.Node;
     
    public class SoapSender {
        private MessageFactory msgFactory;
        private static SoapSender instance = new SoapSender();
         
        private  SoapSender(){
            try {
                //创建消息工厂
                msgFactory = MessageFactory.newInstance();
              } catch (SOAPException e) {
                 e.printStackTrace();
                 throw new RuntimeException(e);
              }
        }
        public static SoapSender getInstance() {
            return instance;
        }
        public MessageFactory getMessageFactory() {
            return msgFactory;
        }
        /* ******************* 以下是创建SOAPMessage*********************** */
        /**
         * 创建一个默认的SOAPMessage
         * @return
         */
        public SOAPMessage getMessage() throws SOAPException {
            return msgFactory.createMessage();
        }
        /**
         * 创建SOAPMessage
         * @param params
         * @return
         */
        public SOAPMessage getMessage(Map<String, String> params) throws SOAPException, Exception {
            // 创建消息对象
            SOAPMessage message = msgFactory.createMessage();
            // 获得一个SOAPPart对象
            SOAPPart soapPart = message.getSOAPPart();
            // 获得信封
            SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
     
    //      // 获得消息头
    //      SOAPHeader soapHeader = soapEnvelope.getHeader();
    //      // 添加头元素
    //      SOAPHeaderElement headerElement = soapHeader.addHeaderElement(soapEnvelope.createName("Fault", "soapenv","http://www.xxx.cn"));
    //      headerElement.addTextNode("JWS0229043");
     
            // *****************创建soap消息主体*****************
            SOAPBody soapBody = soapEnvelope.getBody();
            // 添加消息主体
    //      Name bodyName = soapEnvelope.createName("INFO", "SOAP-ENV","http://www.xxx.cn");
            Name bodyName = soapEnvelope.createName("INFO");
            SOAPBodyElement bodyElement = soapBody.addBodyElement(bodyName);
            Set<String> keys = params.keySet();
            int i = 0;
            for(String name:keys){
                Name eleName = soapEnvelope.createName(name);
                SOAPElement se = bodyElement.addChildElement(eleName);
    //          se.addChildElement("ServiceCode").addTextNode("10000061");
                se.addTextNode(params.get(name));
                i++;
            }
            // *************************************************
     
    //      // 添加SOAP附件
    //      URL url = new URL("http://xxx/1.jpg");
    //      DataHandler dataHandler = new DataHandler(url);//use the JAF
    //      message.addAttachmentPart(message.createAttachmentPart(dataHandler));
     
            // 更新SOAP消息
            message.saveChanges();
            return message;
        }
        /**
         * 创建SOAPMessage
         * @param headers
         * @param filePath:soap格式文件路径
         * @return
         */
        public SOAPMessage getMessage(MimeHeaders headers, String filePath) throws IOException, SOAPException {
    //      filePath = Thread.currentThread().getContextClassLoader().getResource("SOAPMessageResp.xml").getPath();
            InputStream is = new FileInputStream(filePath);
            SOAPMessage message = msgFactory.createMessage(headers, is);
            is.close();
            return message;
        }
        /* ******************* 以下是发送SOAP请求*********************** */
        /**
         * 发送SOAP请求
         * @param requestUrl
         * @param message
         */
        public void send(String requestUrl,SOAPMessage message) throws SOAPException, IOException {
            //创建SOAP连接
            SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
            SOAPConnection sc = scf.createConnection();
            /*
             * 实际的消息是使用 call()方法发送的,该方法接收消息本身和目的地作为参数,并返回第二个 SOAPMessage 作为响应。
             * call方法的message对象为发送的soap报文,url为mule配置的inbound端口地址。
             */
            URL urlEndpoint = new URL(requestUrl);
            // 响应消息
            SOAPMessage response = sc.call(message, urlEndpoint);
            // *************************************************
            if (response != null) {
                //输出SOAP消息到控制台
                System.out.println("Receive SOAP message:");
                response.writeTo(System.out);
            } else {
                System.err.println("No response received from partner!");
            }
            // *************************************************
            // 关闭连接
            sc.close();
        }
        public void send1(String requestUrl,SOAPMessage message) throws SOAPException, Exception{
            //创建SOAP连接
            SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
            SOAPConnection sc = scf.createConnection();
            //发送SOAP消息到目的地,并返回一个消息
            URL urlEndpoint = new URL(requestUrl);
            SOAPMessage response = sc.call(message, urlEndpoint);
            // *************************************************
            response.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "utf-8");
            // 打印服务端返回的soap报文供测试
            System.out.println("Receive SOAP message:");
            // 创建soap消息转换对象
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            // 提取消息内容
            Source sourceContent = response.getSOAPPart().getContent();
            // Set the output for the transformation
            StreamResult result = new StreamResult(System.out);
            transformer.transform(sourceContent, result);
            // *************************************************
            // 关闭连接
            sc.close();
     
            // *************************************************
            /* 模拟客户端A,异常处理测试*/
            SOAPBody ycBody = response.getSOAPBody();
            Node ycResp = ycBody.getFirstChild();
            System.out.print("returnValue:"+ycResp.getTextContent());
        }
        /**
         * 发送SOAP请求
        public void send1(String requestUrl,SOAPMessage request) {
            //定义serviceName对应的QName,第一个参数是对应的namespace
            QName serviceName = new QName("http://xxx.com/", "SOAPMessageService");
            //定义portName对应的QName
            QName portName = new QName("http://xxx.com/", "SOAPMessagePort");
            //使用serviceName创建一个Service对象,该对象还不能直接跟WebService对象进行交互
            Service service = Service.create(serviceName);
    //      //指定wsdl文件的位置
    //      URL wsdl = new URL("http://localhost:8080/test/jaxws/services/SOAPMessage?wsdl");
    //      Service service = Service.create(wsdl, serviceName);
            //创建一个port,并指定WebService的地址,指定地址后我们就可以创建Dispatch了。
            service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, requestUrl);
            //创建一个Dispatch对象
            Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Mode.MESSAGE);
            //调用Dispatch的invoke方法,发送一个SOAPMessage请求,并返回一个SOAPMessage响应。
            SOAPMessage response = dispatch.invoke(request);
            System.out.println("服务端返回如下: ");
            try {
                response.writeTo(System.out);
            } catch (Exception e) {}
        }
         */
     
    }
    

      

      测试方法

    public static void main(String[] args) throws SOAPException, Exception {
             
            Map<String, String> params = new HashMap<String, String>();
            params.put("a","1");
     
            String string="http://xxx/xxx";
             
            /** *************以下是SOAP请求***************** */
            SoapSender sender = SoapSender.getInstance();
     
            SOAPMessage message = sender.getMessage();
    //      SOAPMessage message = sender.getMessage(params);
    //      SOAPMessage message = sender.getMessage(null,"D:\\SOAPMessageResp.xml");
            message.writeTo(System.out);
            sender.send(string,message);
             
        }
    

      

    /*******************************************************************************************/

    服务端:

    package server;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.SOAPBody;
    import javax.xml.soap.SOAPEnvelope;
    import javax.xml.soap.SOAPMessage;
    
    import org.w3c.dom.Node;
    import javax.xml.messaging.JAXMServlet;
    import javax.xml.messaging.ReqRespListener;
    
    public class ServerAction extends JAXMServlet implements ReqRespListener {
    	static MessageFactory mf = null;
    	// 创建一个消息工厂
    	static {
    		try {
    			mf = MessageFactory.newInstance();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	};
    
    	public void init(ServletConfig sc) throws ServletException {
    		super.init(sc);
    	}
    
    	// 处理传过来的SOAP消息,并返回一个SOAP消息
    	public SOAPMessage onMessage(SOAPMessage msg) {
    		SOAPMessage resp = null;
    		try {
    			System.out.println("传入的消息:");
    			msg.writeTo(new FileOutputStream(new File("../webapps/soapmessage.xml")));
    			SOAPBody ycBody = msg.getSOAPBody();
    			Node ycResp = ycBody.getFirstChild();
    			System.out.println("returnValue:"+ycResp.getTextContent());
    
    			// 创建一个返回消息
    			resp = mf.createMessage();
    			SOAPEnvelope se = resp.getSOAPPart().getEnvelope();
    			se.getBody().addChildElement(se.createName("ResponseMessage")).addTextNode("Received Message,Thanks");
    
    			return resp;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		return resp;
    	}
    
    }
    

      配置web.xml

    	<servlet>
    		<servlet-name>StudentInfoServlet</servlet-name>
    		<servlet-class>server.ServerAction</servlet-class>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>StudentInfoServlet</servlet-name>
    		<url-pattern>/StudentInfoServlet</url-pattern>
    	</servlet-mapping>
    

      

    转载于:https://www.cnblogs.com/tongxinyuan/p/4552550.html

    展开全文
  • 本办法学SOAP---SAOP/WSDL祥解

    千次阅读 2015-12-29 10:23:33
    SOAP和WSDL对Web Service、WCF进行深入了解的基础,因此花一些时间去了解一下是很有必要的。 一、SOAP(Simple Object Access Protocol) 如果我们要调用远程对象的方法,就必定要告诉对方,我们要调用的是一个什么...

    SOAP和WSDL对Web Service、WCF进行深入了解的基础,因此花一些时间去了解一下是很有必要的。

    一、SOAP(Simple Object Access Protocol)

    如果我们要调用远程对象的方法,就必定要告诉对方,我们要调用的是一个什么方法,以及这个方法的参数的值等等。然后对方把数据返回给我们。

    这其中就涉及到两个问题:1、数据如何在网络上传输。2、如何表示数据?用什么格式去表示函数以及它的参数等等。

    1、SOAP的传输协议

    SOAP的传输协议使用的就是HTTP协议。只不过HTTP传输的内容是HTML文本,而SOAP协议传输的是SOAP的数据。看一下下面的例子:

    这是一个HTTP请求(请求google的首页)的内容:

    复制代码
    GET / HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Accept-Language: en-us
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; CIBA) chromeframe/4.0
    Accept-Encoding: gzip, deflate
    Connection: Keep-Alive
    Host: www.google.com
    Cookie: PREF=ID=d8f9f1710bfa5f72:U=a5b3bec86b6433ef:NW=1:TM=1260238598:LM=1260241971:GM=1:S=q2agYsw3BsoOQMAs; NID=29=JgIGDDUx70IQTBVAnNEP_E9PLLKBI9STjzaBjgq1eWuDg-_jCgFpka59DrOC0aZKLbj4q77HU1VMKscXTP3OaseyTbv643c2XPe9dS7lsXDHAkAnS46vy-OU8XRqbmxJ; rememberme=true; SID=DQAAAH4AAABW7M4nVkTeOR7eJUmC1AJ4R6hYbmVewuy_uItLUTzZMUTpojdaHUExhPa_EPAkO9Ex1u3r7aPXZ5cj28xHnv2DbfRYf5AyaBcimciuOTITKSIkqn3QSpGDFkRS1Xn7EGzDpCV0V1xFlCu0erf_jfe_D6GOgC2P2S08jNdFS9Vpmw; HSID=AFEFTMA68EgNjkbil; __utmx=173272373.; __utmxx=173272373.

    ---------如果有Post的数据,这里还会有Post的数据--------
    复制代码

     

    这个是一个SOAP请求的内容:

    复制代码

    POST /WebServices/WeatherWebService.asmx HTTP/1.1

    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603)
    Content-Type: text/xml; charset=utf-8
    SOAPAction: "http://WebXml.com.cn/getSupportCity"
    Host: www.webxml.com.cn
    Content-Length: 348
    Expect: 100-continue
    Connection: Keep-Alive

    <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getSupportCity xmlns="http://WebXml.com.cn/"><byProvinceName>广东</byProvinceName></getSupportCity></soap:Body></soap:Envelope>
    复制代码

     

    可以看到,一个SOAP请求其实就是一个HTTP请求,但为了表明内容是SOAP的数据,需要加入上面请求中红色字的部分来以示区别。也就是说,如果请求头中有SOAPAction这一段,那么请求会被当作SOAP的内容来处理而不会当作HTML来解析。可以用上面指定SOAPAction来表示内容是SOAP的内容,也可以指定 Content-Type: application/soap+xml 来表示内容是SOAP的内容。SOAP请求中最后的那段XML数据,这个就是请求的具体内容,这个就是SOAP规定的请求的数据格式,下面再详细对格式进行说明。

     

    2、SOAP的数据格式

    现在知道了SOAP是通过HTTP协议的POST方法来传输数据的,只不过是请求的Header中加了一些标志来说明自己是一个SOAP请求。那么数据的具体格式是怎么规定的呢,我们把上面请求的XML数据展开看一下:

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        
    <soap:Body>
            
    <getSupportCity xmlns="http://WebXml.com.cn/">
                
    <byProvinceName>广东</byProvinceName>
            
    </getSupportCity>
        
    </soap:Body>
    </soap:Envelope>
    复制代码

     其中的<soap:Body>里面的内容就是请求的内容,请求的方法为getSupportCity,该方法有一个名为byProvinceName的参数,参数的值为“广东”这个字符串。再看一下返回的内容:

    复制代码
    HTTP/1.1 200 OK
    Date: Mon, 14 Dec 2009 05:55:39 GMT
    Server: Microsoft-IIS/6.0
    X-Powered-By: ASP.NET
    X-AspNet-Version: 2.0.50727
    Cache-Control: private, max-age=0
    Content-Type: text/xml; charset=utf-8
    Content-Length: 1052

    <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getSupportCityResponse xmlns="http://WebXml.com.cn/"><getSupportCityResult><string>广州 (59287)</string><string>深圳 (59493)</string><string>潮州 (59312)</string><string>韶关 (59082)</string><string>湛江 (59658)</string><string>惠州 (59298)</string><string>清远 (59280)</string><string>东莞 (59289)</string><string>江门 (59473)</string><string>茂名 (59659)</string><string>肇庆 (59278)</string><string>汕尾 (59501)</string><string>河源 (59293)</string><string>揭阳 (59315)</string><string>梅州 (59117)</string><string>中山 (59485)</string><string>德庆 (59269)</string><string>阳江 (59663)</string><string>云浮 (59471)</string><string>珠海 (59488)</string><string>汕头 (59316)</string><string>佛山 (59279)</string></getSupportCityResult></getSupportCityResponse></soap:Body></soap:Envelope>
    复制代码

    返回的HTTP头中并没有标志来表明是一个SOAP的响应,因为的确没有必要,请求方发送出的SOAP请求,返回的肯定是SOAP的响应。

     

    一个典型的SOAP请求格式的结构如下:

    复制代码
    <?xml version="1.0"?>
    <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    soap:encodingStyle
    ="http://www.w3.org/2001/12/soap-encoding">

    <soap:Header>
      
    <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
      soap:mustUnderstand
    ="1">234
      
    </m:Trans>
    </soap:Header>

    <soap:Body>
      
    <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
        
    <m:Item>Apples</m:Item>
      
    </m:GetPrice>
    </soap:Body>

    </soap:Envelope>
    复制代码

     

    下面逐个解释里面的元素:

    a) Envelope

    SOAP的请求内容必须以Envelope做为根节点。

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope",不能修改,否则会出错。http://www.w3.org/2001/12/soap-envelope里面有Envelope的schema的相关定义。有兴趣的可以去这个链接的内容。

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding",这个指定了数据元素的类型。

     

    b) Header

    这个是可选的,如果需要添加Header元素,那么它必须是Envelope的第一个元素。

    Header的内容并没有严格的限制,我们可以自己添加一些和应用程序相关的内容,但是客户端一定要记得处理这些Header元素,可以加上mustUnderstand强制进行处理。

     

    c) Body

    这个就是请求的主题内容了,请求什么函数,参数是什么类型等等都在这里面指定。 

    用标签表示一个函数,然后用子元素表示它的参数。

      

    在调用中没有指定参数和返回类型,这里不需要指定,因为提供服务的一方自己已经规定好了数据类型,在调用时指定数据类型没有任何意义。

     

    二、WSDL(Web Services Description Language)

      WSDL是用来描述WebService的,它用XML的格式描述了WebService有哪些方法、参数类型、访问路径等等。我们要使用一个WebService肯定首先要获取它的WSDL,在VS中添加一个Web 引用时,这些工作由开发环境帮我们做了,开发环境根据WSDL文档给Web Service生成了相应的代理类供我们使用。

    下面是一个HelloWorld的WebService的服务端代码:

    复制代码
    public class Service : System.Web.Services.WebService
    {
        
    public Service () {

            
    //Uncomment the following line if using designed components 
            
    //InitializeComponent(); 
        }

        [WebMethod]
        
    public DateTime HelloWorld(int i)
        {
            
    return DateTime.Now;
        }
    }
    复制代码

        其对应的WebService的WSDL文档如下:

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
     3   <wsdl:types>
     4     <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
     5       <s:element name="HelloWorld">
     6         <s:complexType>
     7           <s:sequence>
     8             <s:element minOccurs="1" maxOccurs="1" name="i" type="s:int" />
     9           </s:sequence>
    10         </s:complexType>
    11       </s:element>
    12       <s:element name="HelloWorldResponse">
    13         <s:complexType>
    14           <s:sequence>
    15             <s:element minOccurs="1" maxOccurs="1" name="HelloWorldResult" type="s:dateTime" />
    16           </s:sequence>
    17         </s:complexType>
    18       </s:element>
    19     </s:schema>
    20   </wsdl:types>
    21   <wsdl:message name="HelloWorldSoapIn">
    22     <wsdl:part name="parameters" element="tns:HelloWorld" />
    23   </wsdl:message>
    24   <wsdl:message name="HelloWorldSoapOut">
    25     <wsdl:part name="parameters" element="tns:HelloWorldResponse" />
    26   </wsdl:message>
    27   <wsdl:portType name="ServiceSoap">
    28     <wsdl:operation name="HelloWorld">
    29       <wsdl:input message="tns:HelloWorldSoapIn" />
    30       <wsdl:output message="tns:HelloWorldSoapOut" />
    31     </wsdl:operation>
    32   </wsdl:portType>
    33   <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap">
    34     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    35     <wsdl:operation name="HelloWorld">
    36       <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
    37       <wsdl:input>
    38         <soap:body use="literal" />
    39       </wsdl:input>
    40       <wsdl:output>
    41         <soap:body use="literal" />
    42       </wsdl:output>
    43     </wsdl:operation>
    44   </wsdl:binding>
    45   <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap">
    46     <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    47     <wsdl:operation name="HelloWorld">
    48       <soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" />
    49       <wsdl:input>
    50         <soap12:body use="literal" />
    51       </wsdl:input>
    52       <wsdl:output>
    53         <soap12:body use="literal" />
    54       </wsdl:output>
    55     </wsdl:operation>
    56   </wsdl:binding>
    57   <wsdl:service name="Service">
    58     <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap">
    59       <soap:address location="http://localhost:2206/WebSite1/Service.asmx" />
    60     </wsdl:port>
    61     <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12">
    62       <soap12:address location="http://localhost:2206/WebSite1/Service.asmx" />
    63     </wsdl:port>
    64   </wsdl:service>
    65 </wsdl:definitions>
    复制代码

     

    一个WSDL文档由四部分组成:

    1、types

      指定了WebService用到的所有数据类型,上面用到了两种数据类型,int和datetime


    2、message

      指明一个操作所用到的数据类型。

      HelloWorldSoapIn是指HelloWorld的输入操作用到的数据类型,HelloWorldSoapOut是指HelloWorld的输出操作用到的数据类型。二者的element元素指出了与types中对应到的具体类型。

     

    3、portType

      指出了这个WebService所有支持的操作,就是说有哪些方法可供调用。

      这里支持一个HelloWorld调用,它的输入和输出对应到HelloWorldSoapIn和HelloWorldSoapOut这个两个数据类型。

     

    4、binding

      soap12:binding元素的transport指明传输协议,这里是http协议。

      operation 指明要暴露给外界调用的操作。

      use属性指定输入输出的编码方式,这里没有指定编码。

     

    5、services

      指定服务的一些信息,主要是指定服务的访问路径。

    关于WSDL的内容可以参考:http://www.w3schools.com/xml/xml_wsdl.asp

    来自:http://www.cnblogs.com/JeffreySun/archive/2009/12/14/1623766.html

    展开全文
  • 首先配置下PHP的soap环境支持:找到php.ini文件;extension=php_soap.dll ;always_populate_raw_post_data = -1 删除掉";" ,启用这两个扩展,重启apache服务器。 服务端:soap.php ...$...

    首先配置下PHP的soap环境支持:

    找到php.ini文件
    ;extension=php_soap.dll

    ;always_populate_raw_post_data = -1

    删除掉";" ,启用这两个扩展,重启apache服务器。

    服务端:soap.php

    <?php
    function getServiceIP(){
        return "1.1.1.1";
    }
    $soap = new SoapServer(null,array('uri'=>"vinson"));
    $soap->addFunction('getServiceIP');
    $soap->addFunction(SOAP_FUNCTIONS_ALL);
    $soap->handle();
    ?>

    客户端:调用

    try {
        $client = new SoapClient(null,
            array('location' =>"http://192.168.1.110/soap.php",'uri' => "vinson",'trace' =>1)
        );
        echo $client->getServiceIP();
    } catch (SoapFault $fault){
        echo "Error: ",$fault->faultcode,", string: ",$fault->faultstring;
    }

    当中的uri是匹配标志,两边要一致,随便什么值

    location自然是需要调用的soap文件,此文件可置于另外一个网站里面

    楼主一直提示

    Error: Client, string: looks like we got no XML document

    近乎抓狂,原来是有个扩展未开启。

    ;always_populate_raw_post_data = -1

     

    转载于:https://www.cnblogs.com/vinsonLu/p/5592378.html

    展开全文
  • 什么是SOAP

    千次阅读 2018-08-06 10:02:40
    SAOP SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构信息。 SOAP为了简化网页服务器(Web ...
  • SAOP使用的一个例子

    千次阅读 2011-10-13 10:13:31
    WebService URL: http://mes:8089/Service.asmx 名字空间:http://tempuri.org/ 调用方法:public string UpdateProduceLotTest(string[] TestInfo) Test
  • java soap 操作和发送soap消息

    千次阅读 2018-11-09 18:56:00
    https://www.cnblogs.com/andy-do/archive/2013/03/28/2986534.html,学习参考
  • 一、创建ASP.NET webservice项目 1、打开vs2013创建 ASP.NET web应用程序 选择空项目; 2、右键项目添加新建项,选择web服务(ASMX); 3、将这个修改 [WebService(Namespace ... ... 二、配置IIS 1、控制面板-》程序和功
  • saop 网络请求 小米 2S 异常1. 问题描述系统环境:MIUI 7 6.3.17开发版 Android 5.0.2错误信息04-06 18:27:49.448: E/AndroidRuntime(27689): java.lang.NoSuchFieldError: No instance field headerOut of type ...
  • 有关json和xml报文的解析和构造

    千次阅读 2016-08-11 20:42:44
    对xml的解析 一、获取document ...Document document = reader.read(new File("saop.xml")); 二、对xml的节点对象的操作方法: 1.获取xml的根节点 Element root = document.getRootEl
  • Intelidea生成Soap客户端代码

    千次阅读 2017-02-06 23:15:53
    下面介绍使用Intelidea生成Soap客户端代码。  的WebService地址为:http://webservice.36wu.com/weatherService.asmx (1)选择一个包,点击右键 (2)选择如下选项
  • typeMapping:需要自定义deserializer和serializer的时候使用这个标签beanMapping:使用axis默认的deserializer和serializer郁闷了很久,主要是使用了castor生成类,在saop发布时,需要自定义的deserializer和serializer....
  • spring aop 配置

    2011-09-08 17:05:45
    spring aop 配置,需要jar包:spring aop相关包及aspectjrt.jar, aspectjweaver.jar,cglib-nodep.jar   order参数可调整aop的执行顺序,数值越小越先执行   <beans xmlns="http:
  • axis1.4 发布webservice的问题

    千次阅读 2012-10-29 14:51:14
    用axis1.4 发布webservice的问题 The service class "org.gdt.sgcda.wf.impl.DefinitionManageServiceImpl" does not comply to one or more requirements of the JAX-RPC 1.1 specification, and may not deploy ...
  • webservice(pers)

    2018-04-04 09:13:48
    1. Java远程方法调用 Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。 1.1 远程调用方案比较 1、Java RMI (Remote Method ...
  • 按照教程配置Axis2,出现如下图示 经过Google(服了天朝长城防火了)漫长搜索等待,终于小心的找到了解决方法如下: 就是只能使用Servlet3.0以下的规范
  • [工具使用] SOAP UI 测试

    千次阅读 2015-06-08 12:26:46
    在日常开发中使用SOAP UI 测试web service 报文。 SOAP UI 基本术语   1 连接数据库 ... 通过groovy 调用jdbc访问数据库。注意,需要把oracle的jdbc驱动放在SAOP UI的安装目录下(SoapUI-Pro-5.1.2
  • saop ui默认生成的报文&lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.payment.fs.kmss.landray.com/"&gt; &lt;...
  • 类似于SAOP技术,基于protobuf。用于数据库数据与C++对象数据之间的序列化,当然了,这个对象还可以在网络上序列化。达到两个目的: 1. 数据库表与对象自动映射,不需要认为写结构体与数据库表字段一一对应 2....
  • gSoap接口函数参数名敏感的解决方法

    千次阅读 2006-07-11 10:17:00
    定义接口函数的时候只声明参数类型不声明参数名,这样在函数调用的时候就不会对参数名称进行检测。 
1 2 3 4 5 ... 20
收藏数 720
精华内容 288
关键字:

saop