1、TCP、UDP、HTTP與Soap協議
TCP
面向連接的通信協議,通過三次握手建立連接,通訊完成時要拆除連接,由於TCP是面向連接的所以只能用於端到端的通訊。
- TCP提供的是一種可靠的數據流服務。
- 採用“帶重傳的肯定確認”技術來實現傳輸的可靠性。
- TCP還採用一種稱爲“滑動窗口”的方式進行流量控制,所謂窗口實際表示接收能力,用以限制發送方的發送速度。
UDP
面向無連接的通訊協議,UDP數據包括目的端口號和源端口號信息,由於通訊不需要連接,所以可以實現廣播發送。
- UDP通訊時不需要接收方確認,屬於不可靠的傳輸,可能會出現丟包現象,實際應用中要求程序員編程驗證。
HTTP
是一個通信協議,通過網絡傳輸信息。
SOAP
是一個基於XML的協議交換消息,可以使用HTTP來傳輸這些信息。事實上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傳輸。
- 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採用的二進制方式傳輸數據流,其實也是各有千秋啊。更多的詳細資料去找百度和谷歌吧。
參考資料: