利用php soap實現web service

php有兩個擴展能夠實現web service,一個是NuSoap,一個是php 官方的soap擴展,因爲soap是官方的,因此咱們這裏以soap來實現web service.因爲默認是沒有打開soap擴展的,因此本身先看一下soap擴展有沒有打開。php

 在soap編寫web service的過程當中主要用到了SoapClient,SoapServer,SoapFault三個類。
web

SoapClient類

這個類用來使用Web services。SoapClient類能夠做爲給定Web services的客戶端。
它有兩種操做形式:

* WSDL 模式
服務器

* Non-WSDL 模式函數

在WSDL模式中,構造器能夠使用WSDL文件名做爲參數,並從WSDL中提取服務所使用的信息。

ui

non-WSDL模式中使用參數來傳遞要使用的信息。code

SoapServer類

這個類能夠用來提供Web services。與SoapClient相似,SoapServer也有兩種操做模式:WSDL模式和non-WSDL模式。這兩種模式的意義跟 SoapClient的兩種模式同樣。在WSDL模式中,服務實現了WSDL提供的接口;在non-WSDL模式中,參數被用來管理服務的行爲。

在SoapServer類的衆多方法中,有三個方法比較重要。它們是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。
接口

下面給出實例:
定義一個提供服務的php類,這個類所提供的函數就是web service對外提供的服務get


<?php
Class PersonInfo
{
    /**
     *    返回姓名
     *    @return string 
     *
     */
    public function getName(){
        return "My Name is Chance";
    }
}
?>


下面給出服務器端的代碼:
string

 <?php
   //包含提供服務的類進來
  require_once('PersonInfo.php');
  
  //wsdl方式提供web service,若是生成了wsdl文件則可直接傳遞到//SoapServer的構造函數中
  //$s = new SoapServer('PersonInfo.wsdl');
  
  //doesn't work 只有location不能提供web service
  //output:looks like we got no XML document
  //$s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php"));
 
  //下面兩種方式都可以工做,只要指定了相應的uri
  //$s = new SoapServer(null,array("uri"=>"Server.php"));
    $s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php","uri"=>"Server.php"));
 
    $s -> setClass("PersonInfo");

    $s -> handle();
?>


下面是客戶端代碼:io

  <?php
  try{
      //wsdl方式調用web service
      //wsdl方式中因爲wsdl文件寫定了,若是發生添加刪除函數等操做改動,不會反應到wsdl,相對non-wsdl方式
      //來講不夠靈活
      //$soap = new SoapClient("http://localhost/Test/MyService/PersonInfo.wsdl");
      
      //non-wsdl方式調用web service    
      //在non-wsdl方式中option location系必須提供的,而服務端的location是選擇性的,能夠不提供
     $soap = new SoapClient(null,array('location'=>"http://localhost/Test/MyService/Server.php",'uri'=>'Server.php'));
     
     //兩種調用方式,直接調用方法,和用__soapCall簡接調用
     $result1 = $soap->getName();
     $result2 = $soap->__soapCall("getName",array());
     echo $result1."<br/>";
     echo $result2;
     
 }catch(SoapFault $e){
     echo $e->getMessage();
 }
 ?>
相關文章
相關標籤/搜索