WebService和WebAPI以及Webervice的應用框架

1、TCP、UDP、HTTP與Soap協議

TCP

面向連接的通信協議,通過三次握手建立連接,通訊完成時要拆除連接,由於TCP是面向連接的所以只能用於端到端的通訊。

  • TCP提供的是一種可靠的數據流服務。
  • 採用“帶重傳的肯定確認”技術來實現傳輸的可靠性。
  • TCP還採用一種稱爲“滑動窗口”的方式進行流量控制,所謂窗口實際表示接收能力,用以限制發送方的發送速度。

UDP

面向無連接的通訊協議,UDP數據包括目的端口號和源端口號信息,由於通訊不需要連接,所以可以實現廣播發送。

  • UDP通訊時不需要接收方確認,屬於不可靠的傳輸,可能會出現丟包現象,實際應用中要求程序員編程驗證。

HTTP

是一個通信協議,通過網絡傳輸信息。

SOAP

是一個基於XML的協議交換消息,可以使用HTTP來傳輸這些信息。事實上HTTP是SOAP消息的最常見的傳輸工具。

關係

  1. 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傳輸。
  2. SOAP被描述爲:簡單的對象訪問協議,簡單對象訪問協議(SOAP)是一種輕量的、簡單的、基於 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的信息。 SOAP 可以和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議( HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。SOAP協議可以簡單地理解爲:SOAP=RPC+HTTP+XML,即採用HTTP作爲通信協議,RPC(Remote Procedure Call Protocol  遠程過程調用協議)作爲一致性的調用途徑,XML作爲數據傳送的格式,從而允許服務提供者和服務客戶經過防火牆在Internet上進行通信交互。

SOAP與HTTP的區別

  • 都是底層的通信協議,請求包的格式不同,soap包是XML格式,http純文本格式
  • soap 的 可以傳遞結構化的 數據,http只能傳輸純文本數據;
  • SOAP:簡單對象訪問協議             http是標準超文本傳輸協議
  • SOAP相對http(post/get)由於要進行xml解析,速度可能會有所降低。 

2、webservice接口與HTTP接口

2.1、webservice接口測試:

測試webservice接口,可以使用soapUI來進行測試,下面簡單用soapUI來調用webservice接口:

      1.打開soapUI,新建一個soap工程:

2.我們以天氣預報的wsdl地址爲例,導入soapUI查看其中的所有接口信息;

   wsdl地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

3、查看接口及報文,輸入參數直接進行調用

發送報文:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://WebXml.com.cn/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:getSupportCity>
         <!--Optional:-->
         <web:byProvinceName>北京</web:byProvinceName>
      </web:getSupportCity>
   </soapenv:Body>
</soapenv:Envelope>

接收報文:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <getSupportCityResponse xmlns="http://WebXml.com.cn/">
         <getSupportCityResult>
            <string>北京 (54511)</string>
            <string>上海 (58367)</string>
            <string>天津 (54517)</string>
            <string>重慶 (57516)</string>
         </getSupportCityResult>
      </getSupportCityResponse>
   </soap:Body>
</soap:Envelope>
  • 1、根元素:Envelope。
  • 2、Header元素::不是強制出現,由程序員控制,主要用於攜帶一些額外的信息,比如用戶名、密碼
  • 3、Body:調用正確,body元素內容應該遵守WSDL要求的格式。

2.2、HTTP接口

     這裏不再做詳細介紹,就是我們常用的post、get、delete、put等接口,結果返回狀態和json。例如使用postman測試:

  • http://api.xxxxxxxx.com:6895/api/live/stop
  • 返回結果如下:
{ 
     "errcode" : "0", 
     "errdesc" : "OK"
 }

3、php中四種webservice實現的簡單架構方法及實例

3.1、PHP本身的SOAP

所有的webservice都包括服務端(server)和客戶端(client)。要使用php本身的soap首先要把該拓展安裝好並且啓用。下面看具體的code

服務端

<?php   
class test   
{   
    function show()   
    {   
        return 'the data you request!';   
    }   
}   
function getUserInfo($name)   
{   
    return 'fbbin';   
}   
//實例化的參數手冊上面有,這個是沒有使用wsdl的,所以第一個參數爲null,如果有使用wsdl,那麼第一個參數就是這個wsdl文件的地址。   
$server = new SoapServer(null, array('uri' ='http://soap/','location'='http://localhost/test/server.php'));   
$server->setClass('test');   
//$server->addFunction('getUserInfo');   
$server->handle();   
?>

客戶端

$soap = new SoapClient(null, array('location'='http://localhost/test/server.php','uri' ='http://soap/'));     
  
echo $soap->show();   
//得到:'the data you request!'   
  
//echo $soap->getUserInfo('sss');  

3.2、PHPRPC

首先到官網(http://www.phprpc.org/zh_CN/ )上面去下載最新版的phprpc,解壓之後會有相關的文件,我們把文件進行劃分(服務端和客戶端文件)如下

服務端文件

dhparams   
dhparams.php   
phprpc_server.php   
bigint.php   
compat.php   
phprpc_date.php   
xxtea.php

客戶端文件

phprpc_client.php   
bigint.php   
compat.php   
phprpc_date.php   
xxtea.php 

我們把服務端文件放在服務端文件夾中,然後把客戶端文件放在客戶端文件夾中,之後再服務端文件夾中新建個文件(server.php)作爲服務,然後再客戶端新建個文件(client.php)作爲客戶端,各自代碼如下:

//服務端: 
include_once"phprpc_server.php"; //加載phprpc文件   
$server = new PHPRPC_Server();   
$server->add('getUser');   
$server->setDebugMode(true);   
$server->start();   
function getUser( )   
{   
    return ‘the data you request!’;   
}   
  
//客戶端:   
include_once "phprpc_client.php";   
$client = new PHPRPC_Client('http://127.0.0.1/phpservice/phprpcserver/server.php');   
$data = $client->getUser();   
var_dump($data);   
//得到:the data you request!

3.3、開源的NUSOAP

首先到網上去下載最新版的nusoap,現在的最新版本是0.9.5的,解壓之後會得到一個lib文件夾,把這個文件分別放到服務端和客戶端各一份,然後再服務端和客戶端分別建立server.php和client.php文件,作爲通信文件。

//服務端
ini_set("soap.wsdl_cache_enabled", 0);//關閉緩存   
require_once("lib/nusoap.php"); //加載nusoap文件   
$server = new soap_server;   
$server->configureWSDL('nusoasp');//設定服務的名稱,使用的wsdl來通信,如果不適用wsdl將會更簡單,網上有很多的例子   
$server->register('getUserInfo', array('name'="xsd:string", 'email'="xsd:string"), array('return'="xsd:string"));   
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';   
$server->service( $HTTP_RAW_POST_DATA );   
function getUserInfo($name, $email)   
{   
    return ‘the data you request!’;   
}  


//客戶端
require_once("lib/nusoap.php");   
$client = new soapclient('http://localhost/phpservice/nusoapserver/server.php?wsdl');   
$pagram = array('fbbin', '[email protected]');   
$string = $client->call('getUserInfo', $pagram);   
//得到:the data you request!  

3.4、HessianPHP

hessian其實我個人認爲他不是一個webservice,只能說是類似而已。因爲它不具備webservice的那些特性。它支持的語言比較多我們現在只需要研究php版本的HessianPHP就行了,下載最新版本是v2.0.3的,解壓之後會得到一個src的目錄,這個目錄使我們需要使用的一個核心文件夾。
我們把名字重命名爲HessianPHP然後分別分別放到server和client端,然後分別建立server.php和client.php文件。

//服務端
include_once 'HessianPHP/HessianService.php';//加載核心文件   
class TestService   
{   
    public function __construct()   
    {   
  
    }   
  
    public function add($numa, $numb)   
    {   
        return $numa + $numb;   
    }   
  
    public function check()   
    {   
        return '[email protected]';   
    }   
}   
$test = new TestService();   
$hessian = new HessianService( $test, array('displayInfo' => true) );   
$hessian->handle();//注意這裏不是網上的$hessian->service(),可能是版本不一樣,改了吧!我也是看了源碼才知道!   


//客戶端
include_once 'HessianPHP/HessianClient.php';   
$url = "http://localhost/phpservice/hessianserver/server.php";   
$options = new HessianOptions();   
$client = new HessianClient( $url, $options );   
$num = $client->add( 3, 5 );   
echo $num;//得到:8;   
echo $client->check();//得到:[email protected]

以上四種方式爲web開發過程中常用到的webservice通信方式。用的最多的是nusoap,phprpc在性能上面和nusoap基本上差不多,只不過,phprpc在商業上是收費的。還有個hessianPHP採用的二進制方式傳輸數據流,其實也是各有千秋啊。更多的詳細資料去找百度和谷歌吧。

 

 

 

 

參考資料:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章