背景:在最近的開發中,爲了解決公司內部系統與外部系統的對接,開始接觸到了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 之上進行信息交換。瀏覽器
HTTP與SOAP:網絡
什麼是WSDL:WSDL(網絡服務描述語言,Web Services Description Language)是一門基於 XML 的語言,用於描述 Web Services 以及如何對它們進行訪問。數據結構
什麼是UDDI:UDDI 是一種目錄服務,企業可使用它對 Web services 進行註冊和搜索。tcp
UDDI基於什麼:分佈式
PHP建立webservice:工具
前提:環境要確保PHP支持SOAP;測試
建立一個.wsdl文件(方式:一、使用zend studio工具直接生成;二、使用SoapDiscovery.class.php自動生成wsdl文件)
<?php /** * Created by PhpStorm. * User: 黎志明 * Date: 2018/6/19 * Time: 11:40 */ class Person { public function say() { return "我在說話。"; } public function run() { return "我在跑步"; } }
<?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();
<?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>
<?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();//處理請求
<?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的開發人員來講很簡單的。