zoukankan      html  css  js  c++  java
  • WebService SOAP WSDL UDDI 使用php的curl、PHP5的SoapClient实现同步

    一、基本名词

    WebService: 
    WebService是一种跨编程语言和跨操作系统平台的远程调用技术。不同系统,不同语言的数据交换方法都是不同的,这就导致在不同系统,不同语言之间传递数据很麻烦,基于此,WebService出现了。SOAP、WSDL和UDDI构成WebService平台的基础。 
    SOAP(Simple Object Access Protocol): 
    要想传递数据,首先我们要统一数据的格式,这样大家按照同一个规范了才能保证数据格式统一,不会错乱。SOAP是基于xml定义的轻量级协议。 
    WSDL(Web Services Description Language): 
    WSDL文件用于告诉使用者数据的具体格式、数据参数、服务地址、可用函数等,解析wsdl文件就知道对方提供的服务内容。推荐软件soapui解析wsdl文件。 
    UDDI(Universal Description, Discovery and Integration): 
    统一描述、发现和集成,用于集中存放和查找WSDL描述文件,起着目录服务器,分享服务的作用。 
    虽然都是一些新的概念,但其实WebService都是基于一些旧有的技术,所以当了解原理后,就可以用原有的技术实现同样的功能。

    二、php实现同步

    由于这部分只涉及到同步,所有使用curl就能完成。以下就是代码: 
    只需要在http的头域中添加相应的方法,并用xml传递数据。依照同理,其他语言同样可以实现。关于方法和xml格式建议使用soapui解析wsdl文件获得。 

    private function http_request_xml($url,$data = null,$arr_header = null){
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)){
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            if(!empty($arr_header)){
                curl_setopt($curl, CURLOPT_HTTPHEADER, $arr_header);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
    }
    
    $xml = "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:app="http://siebel.com/Voucher/Apply">
            <soapenv:Header/>
            <soapenv:Body>
                <app:VoucherApply_Input>
                    <app:count>1</app:count>
                    <app:memberNumber>".$mem."</app:memberNumber>
                </app:VoucherApply_Input>
            </soapenv:Body>
        </soapenv:Envelope>";
    $arr_header[] = "Content-type: text/xml"; //使用xml格式传递
    $arr_header[] = "SOAPAction:"document/http://siebel.com/Voucher/Apply:VoucherApply""; //添加swdl的方法
    $res = $this->http_request_xml($url, $xml, $arr_header);
    if(strstr($res,"<ns:flag>S</ns:flag>")){
    }
    

      PHP5下方法 
    1、在php的的配置文件php.ini中,找到

    extension=php_soap.dll
    

      

    去掉;号,重启。

    2、获取方法和参数:

    <?php
    header("content-type:text/html;charset=utf-8");
    try {
        $client = new SoapClient("http://***.******.com/services?wsdl");
        print_r($client->__getFunctions());
        print_r($client->__getTypes());  
    } catch (SOAPFault $e) {
        print $e;
    }
    ?>
    

    3、带参数访问:

    <?php
    header("content-type:text/html;charset=utf-8");
    try {
        $client = new SoapClient('http://***.*******.com/services?wsdl');
        $xml = "<?xml version='1.0' encoding='UTF-8' ?>";
        $return = $client->function($xml);
        print_r($res);
    } catch (SOAPFault $e) {
        print_r('Exception:'.$e);
    }
    ?>
    

      

    三、WSDL详解

    直接打开wsdl文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    
    <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsdLocal1="http://www.siebel.com/xml/TESITOSynTxn" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://siebel.com/Transaction" targetNamespace="http://siebel.com/Transaction">   // 所有的WSDL文档的根元素均是definitions元素。该元素封装了整个文档。
      <types>   // web service使用的数据类型,types元素用作一个容器,用于定义XML模式内置类型中没有描述的各种数据类型。
        <xsd:schema elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="http://www.siebel.com/xml/TESITOSynTxn">   // xsd根元素
          <xsd:annotation>
            <xsd:documentation>Copyright (C) 2001-2004</xsd:documentation>
          </xsd:annotation>
          <xsd:element name="ListOfLoyTransaction" type="xsdLocal1:ListOfLoyTransaction"/> //定义一个数据类型
    
            <xsd:complexType name="ListOfLoyTransactionTopElmt">
              <xsd:sequence>
                <xsd:element name="ListOfLoyTransaction" maxOccurs="1" minOccurs="1" type="xsdLocal1:ListOfLoyTransaction"/>  //定义一个子数据类型
              </xsd:sequence> 
            </xsd:complexType>
    
            <xsd:complexType name="ListOfLoyTransaction">
              <xsd:sequence>
                <xsd:element name="Transaction" maxOccurs="unbounded" minOccurs="0" type="xsdLocal1:LOYTransaction"/>
              </xsd:sequence>
            </xsd:complexType>
    
            <xsd:complexType name="Transaction">   // 父元素
              <xsd:sequence>       // 表示子元素依次出现顺序
                <xsd:element name="RedMark" maxOccurs="1" minOccurs="0" type="xsd:string"/>   // maxOccurs最多数量 minOccurs最少数量,实现参数的可选
                <xsd:element name="ProdCode" maxOccurs="1" minOccurs="0" type="xsd:string"/>
                <xsd:element name="OrderType" maxOccurs="1" minOccurs="0" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
    
        </xsd:schema>
    
        <xsd:schema elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="http://siebel.com/Transaction">
          <xsd:import namespace="http://www.siebel.com/xml/SynTxn"/> // import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。
    
          <xsd:element name="Txn_Input">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element ref="xsdLocal1:ListOfLoyTransaction"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
    
          <xsd:element name="Txn_Output">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="ErrorFlag" type="xsd:string"/>
                <xsd:element name="ErrorMessage" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
    
        </xsd:schema>
      </types>
    
      <message name="Txn_Input">   //web service 使用的消息
        <part name="Txn_Input" element="tns:Txn_Input"/>
      </message>
      <message name="Txn_Output">   //web service 使用的消息
        <part name="Txn_Output" element="tns:Txn_Output"/>
      </message>
    
      <portType name="spcSyn_spcTransaction_spcWorkflow"> // portType元素定义了Web服务的抽象接口。portType元素是由binding和service元素来实现的,
        <operation name="Txn">
          <input message="tns:Txn_Input"/>
          <output message="tns:Txn_Output"/>
        </operation>
      </portType>
    
      <binding name="spcSyn_spcTransaction_spcWorkflow" type="tns:spcSyn_spcTransaction_spcWorkflow">  //web service 使用的通信协议,将一个抽象portType映射到一组具体协议(SOAO和HTTP)、消息传递样式、编码样式。
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <operation name="Txn">
          <soap:operation soapAction="document/http://siebel.com/Transaction:Txn"/>
          <input>
            <soap:body use="literal"/>
          </input>
          <output>
            <soap:body use="literal"/>
          </output>
        </operation>
      </binding>
    
      <service name="SynTransaction"> // service元素包含一个或者多个port元素,其中每个port元素表示一个不同的Web服务。
        <port binding="tns:spcSyn_spcTransaction_spcWorkflow" name="spcSyn_spcTransaction_spcWorkflow">
          <soap:address location="http://172.19.100.88/aaaa/bbbb/cccc"/>
        </port>
      </service>
    
    </definitions>
    

      

    (PHP)用cURL调用WebService获取天气信息

    <?php  
    /** 
     * 用cURL调用WebService获取天气信息 
     * User: Ollydebug 
     * Date: 2015/11/11 
     * Time: 19:44 
     */  
      
    //在WeatherWs的服务器上,默认大连城市的 theCityCode = 864  
      
    $data = 'theCityCode=864&theUserID=';  
    $curlobj = curl_init();  
      
    curl_setopt($curlobj,CURLOPT_URL,"http://www.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather");  
    curl_setopt($curlobj,CURLOPT_HEADER,0);  
    curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,1);  
    curl_setopt($curlobj,CURLOPT_POST,1);  
    curl_setopt($curlobj,CURLOPT_POSTFIELDS,$data);  
    curl_setopt($curlobj,CURLOPT_HTTPHEADER,array("application/x-www-form-urlencoded;charset=utf-8;","Content-length: ".strlen($data)));  
    curl_setopt($curlobj, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36');  
      
    $rtn = curl_exec($curlobj);  
    if(!curl_errno($curlobj)){  
        echo $rtn;  
    }else{  
        echo 'Curl error: '.curl_errno($curlobj);  
    }  
    curl_close($curlobj);  
      
    ?>  
    

     

  • 相关阅读:
    C#校验算法列举
    SuperSocket1.6电子书离线版
    C#检测系统是否激活[转自StackOverFlow]
    WSMBT Modbus & WSMBS Modbus 控件及注册机
    AU3获取系统激活信息
    JavaScript跨浏览器事件处理
    OAuth2的学习小结
    R学习日记——分解时间序列(季节性数据)
    R学习日记——分解时间序列(非季节性数据)
    Java内存分配原理
  • 原文地址:https://www.cnblogs.com/mracale/p/8444683.html
Copyright © 2011-2022 走看看