淺談PHP企業級應用之WebService篇_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:淺談PHP企業級應用之常見緩存技術篇
      別每天OO,這個配置怎么改,這段代碼哪錯了,沒勁,好的程序不光是代碼寫的好,整體架構很重要,多了解程序之外的東西,這篇不再單單是程序方面的東西了,會寫到從程序到服務器的設置,會比較多,但個人的經驗有限,知道的就這么多,不知道的我也沒法寫呀,

      來段企業級應用吧,主要是講PHP5對webservice的一些實現(以下的程序可以被JAVA,NET,C等正常調用)

      國內用PHP寫WebService的真的很少,網上資料也沒多少,公司的項目開發過程中,經歷了不少這方面的東西,寫出來以供大家參考(謝謝老農提供的WSDL和程序文件)

      客戶端

      <?php
      header ( "Content-Type: text/html; charset=utf-8" );
      /*
      * 指定WebService路徑并初始化一個WebService客戶端
      */
      $ws = "http://soap/soapCspMessage.php?wsdl";
      $client = new SoapClient ( $ws, array ('trace' => 1, 'uri' => 'http://www.zxsv.com/SoapDiscovery/' ) );
      /*
      * 獲取SoapClient對象引用的服務所提供的所有方法
      */
      echo ("SOAP服務器提供的開放函數:");
      echo ('<pre>');
      var_dump ( $client->__getFunctions () );
      echo ('</pre>');
      echo ("SOAP服務器提供的Type:");
      echo ('<pre>');
      var_dump ( $client->__getTypes () );
      echo ('</pre>');
      echo ("執行GetGUIDNode的結果:");
      //$users = $client->GetUsers();
      //var_dump($HelloWorld );
      $parameters = array('uname'=>'zxsv',"upassword"=>'123');
          $out = $client->HelloWorld($parameters);
          $datadb = $out->HelloWorldResponse;
          var_dump($out);
      ?>

      服務端

      <?php
      class Member
      {
          public $UserId;
          public $Name;
          public function __construct($parmas){
              $this->UserId = $parmas[0];
              $this->Name = $parmas[1];
          }
      }
      $servidorSoap = new SoapServer('testphp.xml',array('uri' => 'http://www.TestPHP.com/','encoding'=>'utf-8','soap_version' => SOAP_1_2 ));
      $servidorSoap->setClass(Testphp);
      $servidorSoap->handle();
      class Testphp {
          public function HelloWorld($uid){
              return array('HelloWorldResult'=>"mystring".$uid->{'uname'}.' and '.$uid->{'upassword'});
          }
          public function GetMember($uid){
              $s=array();
              for($i=0;$i<$uid->{'uid'};$i++){
                  $s[] =&new Member(array($i, $uid->{'uname'}.'我測試'.$i));
              }
              return   array('GetMemberResult'=>$s);
          }
      }
      ?>

      到這里應該都看的懂吧
      下面是WSDL文件

      <?xml version="1.0" encoding="utf-8"?>
      <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://www.TestPHP.com/" 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://www.TestPHP.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
      <wsdl:types>
          <s:schema elementFormDefault="qualified" targetNamespace="
      http://www.TestPHP.com/">
            <s:element name="HelloWorld">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" />
                  <s:element minOccurs="0" maxOccurs="1" name="upassword" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:element name="HelloWorldResponse">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:element name="GetMember">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="1" maxOccurs="1" name="uid" type="s:int" />
                  <s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:element name="GetMemberResponse">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="GetMemberResult" type="tns:ArrayOfMember" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:complexType name="ArrayOfMember">
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="unbounded" name="Member" nillable="true" type="tns:Member" />
              </s:sequence>
            </s:complexType>
            <s:complexType name="Member">
              <s:sequence>
                <s:element minOccurs="1" maxOccurs="1" name="UserId" type="s:int" />
                <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
              </s:sequence>
            </s:complexType>
          </s:schema>
      </wsdl:types>
      <wsdl:message name="HelloWorldSoapIn">
          <wsdl:part name="parameters" element="tns:HelloWorld" />
      </wsdl:message>
      <wsdl:message name="HelloWorldSoapOut">
          <wsdl:part name="parameters" element="tns:HelloWorldResponse" />
      </wsdl:message>
      <wsdl:message name="GetMemberSoapIn">
          <wsdl:part name="parameters" element="tns:GetMember" />
      </wsdl:message>
      <wsdl:message name="GetMemberSoapOut">
          <wsdl:part name="parameters" element="tns:GetMemberResponse" />
      </wsdl:message>
      <wsdl:portType name="TestPHPSoap">
          <wsdl:operation name="HelloWorld">
            <wsdl:input message="tns:HelloWorldSoapIn" />
            <wsdl:output message="tns:HelloWorldSoapOut" />
          </wsdl:operation>
          <wsdl:operation name="GetMember">
            <wsdl:input message="tns:GetMemberSoapIn" />
            <wsdl:output message="tns:GetMemberSoapOut" />
          </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="TestPHPSoap" type="tns:TestPHPSoap">
          <soap:binding transport="
      http://schemas.xmlsoap.org/soap/http" />
          <wsdl:operation name="HelloWorld">
            <soap:operation soapAction="
      http://www.TestPHP.com/HelloWorld"   />
            <wsdl:input>
              <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
              <soap:body use="literal" />
            </wsdl:output>
          </wsdl:operation>
          <wsdl:operation name="GetMember">
            <soap:operation soapAction="
      http://www.TestPHP.com/GetMember" />
            <wsdl:input>
              <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
              <soap:body use="literal" />
            </wsdl:output>
          </wsdl:operation>
      </wsdl:binding>
      <wsdl:binding name="TestPHPSoap12" type="tns:TestPHPSoap">
          <soap12:binding transport="
      http://schemas.xmlsoap.org/soap/http" />
          <wsdl:operation name="HelloWorld">
            <soap12:operation soapAction="
      http://www.TestPHP.com/HelloWorld" />
            <wsdl:input>
              <soap12:body use="literal" />
            </wsdl:input>
            <wsdl:output>
              <soap12:body use="literal" />
            </wsdl:output>
          </wsdl:operation>
          <wsdl:operation name="GetMember">
            <soap12:operation soapAction="
      http://www.TestPHP.com/GetMember" />
            <wsdl:input>
              <soap12:body use="literal" />
            </wsdl:input>
            <wsdl:output>
              <soap12:body use="literal" />
            </wsdl:output>
          </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="TestPHP">
          <wsdl:port name="TestPHPSoap" binding="tns:TestPHPSoap">
            <soap:address location="
      http://soap/goodwsdl/testphp.php" />
          </wsdl:port>
          <wsdl:port name="TestPHPSoap12" binding="tns:TestPHPSoap12">
            <soap12:address location="
      http://soap/goodwsdl/testphp.php" />
          </wsdl:port>
      </wsdl:service>
      </wsdl:definitions>

      這里有返回的兩個字段,一個是返回字符串,這個很好理解

      <s:element name="HelloWorld">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" />
                  <s:element minOccurs="0" maxOccurs="1" name="upassword" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:element name="HelloWorldResponse">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:element>

      這一段就字符串的
      那返回數組的就比較麻煩了,我和老農搞了一兩周才發現是WSDL文件寫錯了,看下面的一段

            <s:element name="GetMember">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="1" maxOccurs="1" name="uid" type="s:int" />
                  <s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:element name="GetMemberResponse">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="GetMemberResult" type="tns:ArrayOfMember" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:complexType name="ArrayOfMember">
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="unbounded" name="Member" nillable="true" type="tns:Member" />
              </s:sequence>
            </s:complexType>
            <s:complexType name="Member">
              <s:sequence>
                <s:element minOccurs="1" maxOccurs="1" name="UserId" type="s:int" />
                <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
              </s:sequence>
            </s:complexType>

      第一段GetMember是輸入,最重要的是GetMemberResponse這段,看type="tns:ArrayOfMember"這里,返回一個數組,WSDL中定義了ArrayOf這個,后面的就簡單了,ArrayOfMember的類型是type="tns:Member" ,從name="Member"得到要返回的數組,完工。

      分享:三個準則教你成為PHP編程高手
      PHP是一門高效的網絡編程語言,由于他具有編寫靈活、運行快速等好處,迅速成為Web程式員的最佳選擇語言。前不久的一份權威調查表明,目前已有31.6%的網站使用PHP作為主要的服務器端編程語言。 不過,要成為一名PHP編程高手卻并不容易。并不像非常多人想象的

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-07-09
      相關PHP教程