PHP webservice初探

背景:在最近的開發中,爲了解決公司內部系統與外部系統的對接,開始接觸到了webservice接口,外部公司提供接口供咱們調用,已達到數據同步的目的,所以有必要普及一下web service的知識了!php

什麼是web service:web service是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程序,可以使用開放的XML(標準通用標記御園下的一個子集)標準來描述、發佈、發現、協調和配置這些應用程序,用於開發分佈式的互操做的應用程序。web

webservice三要素:SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration)之一, soap用來描述傳遞信息的格式, WSDL 用來描述如何訪問具體的接口, uddi用來管理,分發,查詢webService 。具體實現能夠搜索 Web Services簡單實例 ; SOAP 能夠和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議(HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。SOAP使用基於XML的數據結構超文本傳輸協議(HTTP)的組合定義了一個標準的方法來使用Internet上各類不一樣操做環境中的分佈式對象編程

什麼是SOAP:SOAP 是基於 XML 的簡易協議,可以使應用程序在 HTTP 之上進行信息交換。瀏覽器

  • SOAP 指簡易對象訪問協議
  • SOAP 是一種通訊協議
  • SOAP 用於應用程序之間的通訊
  • SOAP 是一種用於發送消息的格式
  • SOAP 被設計用來經過因特網進行通訊
  • SOAP 獨立於平臺
  • SOAP 獨立於語言
  • SOAP 基於 XML
  • SOAP 很簡單並可擴展
  • SOAP 容許您繞過防火牆
  • SOAP 將被做爲 W3C 標準來發展

HTTP與SOAP網絡

  • 通俗易懂的一種說法(HTTP就是郵局的協議,他們規定了你的信封要怎麼寫,要貼多少郵票等,SOAP就是大家之間交流的協議,負責把你所須要表達的意思寫在信紙上,同時也負責讓對方可以看得懂你的信。);
  • 事實上HTTP是SOAP消息的最多見的傳輸工具。soap將信息進行XML的序列化後,再用http協議的方式再打包進行傳送,傳送的方式仍是tcp或者udp。作個比喻就好理解了。tcp 和 udp 都是公路,暫且把tcp認爲是通常公路,udp高速公路,soap和http就都是汽車,那麼soap和http均可以在tcp和udp上跑。說soap能夠經過http來傳送,實際就是說soap是小轎車,http是裝轎車的卡車,把soap的信息裝到http裏面,而後再運輸,固然走的道路仍是tcp或udp。說soap能夠經過http協議來傳輸,這句話不太準確,比較準確第說法是:soap信息能夠經過http協議包裝後經過tcp或udp傳輸。

什麼是WSDL:WSDL(網絡服務描述語言,Web Services Description Language)是一門基於 XML 的語言,用於描述 Web Services 以及如何對它們進行訪問。數據結構

  • WSDL 指網絡服務描述語言
  • WSDL 使用 XML 編寫
  • WSDL 是一種 XML 文檔
  • WSDL 用於描述網絡服務
  • WSDL 也可用於定位網絡服務
  • WSDL 還不是 W3C 標準

什麼是UDDI:UDDI 是一種目錄服務,企業可使用它對 Web services 進行註冊和搜索。tcp

  • UDDI 指的是通用描述、發現與集成服務
  • UDDI 是一種用於存儲有關 web services 的信息的目錄。
  • UDDI 是一種由 WSDL 描述的 web services 界面的目錄。
  • UDDI 經由 SOAP 進行通訊
  • UDDI 被構建入了微軟的 .NET 平臺

UDDI基於什麼:分佈式

  • UDDI 使用 W3C 和 IETF* 的因特網標準,好比 XML、HTTP 和 DNS 協議。
  • UDDI 使用 WSDL 來描述到達 web services 的界面
  • 此外,經過採用 SOAP,還能夠實現跨平臺的編程特性,你們知道,SOAP 是 XML 的協議通訊規範,可在 W3C 的網站找到相關的信息。

PHP建立webservice:工具

前提:環境要確保PHP支持SOAP;測試

建立一個.wsdl文件(方式:一、使用zend studio工具直接生成;二、使用SoapDiscovery.class.php自動生成wsdl文件)

  • 定義服務類:Service.php,該服務端就是實現對外提供的接口,好比寫一個類(Person.class.php);代碼以下:
<?php

/**
 * Created by PhpStorm.
 * User: 黎志明
 * Date: 2018/6/19
 * Time: 11:40
 */
class Person
{
    public function say()
    {
        return "我在說話。";
    }
    public function run()
    {
        return "我在跑步";
    }
}
  • 建立service.php文件,生成.wsdl文件,代碼以下:
<?php
/**
 * Created by PhpStorm.
 * User: 黎志明
 * Date: 2018/6/19
 * Time: 11:41
 */
include("Person.class.php");
include("SoapDiscovery.class.php");
//第一個參數是類名(生成的wsdl文件就是以它來命名的),即person類,第二個參數是服務的名字(這個能夠隨便寫)。
$disco = new SoapDiscovery('Person', 'Person');
$disco->getWSDL();
  • 瀏覽器直接訪問Service.php,生成Person.wsdl文件
<?xml version="1.0" ?>
<definitions name="Person" targetNamespace="urn:Person" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:Person"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
             xmlns="http://schemas.xmlsoap.org/wsdl/">
    <types xmlns="http://schemas.xmlsoap.org/wsdl/"/>
    <portType name="PersonPort">
        <operation name="say">
            <input message="tns:sayRequest"/>
            <output message="tns:sayResponse"/>
        </operation>
        <operation name="run">
            <input message="tns:runRequest"/>
            <output message="tns:runResponse"/>
        </operation>
    </portType>
    <binding name="PersonBinding" type="tns:PersonPort">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="say">
            <soap:operation soapAction="urn:Person#Person#say"/>
            <input>
                <soap:body use="encoded" namespace="urn:Person"
                           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>
            <output>
                <soap:body use="encoded" namespace="urn:Person"
                           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
        <operation name="run">
            <soap:operation soapAction="urn:Person#Person#run"/>
            <input>
                <soap:body use="encoded" namespace="urn:Person"
                           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>
            <output>
                <soap:body use="encoded" namespace="urn:Person"
                           encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
    </binding>
    <service name="Person">
        <documentation/>
        <port name="PersonPort" binding="tns:PersonBinding">
            <soap:address location="http://localhost:80/wsdl/Service.php"/>
        </port>
    </service>
    <message name="sayRequest">
    </message>
    <message name="sayResponse">
        <part name="say" type="xsd:string"/>
    </message>
    <message name="runRequest">
    </message>
    <message name="runResponse">
        <part name="run" type="xsd:string"/>
    </message>
</definitions>
  • 將Service.php文件的內容清空,把一下代碼複製進去:
<?php
/**
 * Created by PhpStorm.
 * User: 黎志明
 * Date: 2018/6/19
 * Time: 11:41
 */

include("Person.class.php");
$objSoapServer = new SoapServer("Person.wsdl");//person.wsdl是剛建立的wsdl文件
//$objSoapServer = new SoapServer("server.php?wsdl");//這樣也行
$objSoapServer->setClass("Person");//註冊person類的全部方法
$objSoapServer->handle();//處理請求
  • 建立webservice客戶端程序,測試webservice是否郵箱,文件名爲:client.php,代碼以下:
<?php
/**
 * Created by PhpStorm.
 * User: 黎志明
 * Date: 2018/6/19
 * Time: 11:59
 */
$client = new SoapClient("Person.wsdl");
//$client = new SoapClient("server.php?wsdl");//這樣也行 
echo $client->say();
echo "<br />";
echo $client->run();
echo "<br />"; 

  小結:.NET若是要使用的話,只要提供一個url給他就好了;得到url的方法:你能夠先到Person.wsdl文件裏面查找<soap:address location="http://localhost:80/wsdl/Service.php" />,這裏的url(具體url是根據你的目錄肯定的)就是你要提供給.NET開發人員使用的;不過別高興太早,後面要加:「?wsdl」,http://localhost:80/wsdl/Service.php?wsdl這樣纔是對的,不信你能夠將url拷貝到瀏覽器的地址欄裏看下就知道了,.NET開發人員得到你給他的url以後,就能夠在本身的項目裏面添加一個服務引用或者web引用了,而後就能夠根據提示完成相關操做,對於使用.NET的開發人員來講很簡單的。

相關文章
相關標籤/搜索