Я использую perl и mySql чуть более суток и написал клиент / сервер PHP для базового веб-сервиса, который запрашивает базу данных и возвращает результаты клиенту. У меня есть некоторый опыт использования веб-сервисов java и JAX-WS.
Из-за отсутствия типизации обработка сложных типов совершенно иная, чем в JAX-WS, в том, что проверка типа не выполняется для возвращаемого или входного параметра. Сервер возвращает многомерный массив клиенту и все работает правильно.
Играя с WSDL, я заметил, что объявления типов не влияют, несмотря на то, что на них есть ссылка в элементе part элемента message. Я удалил всю декларацию типов, и программа продолжала корректно работать.
Я что-то упустил, есть ли в PHP какой-либо способ использовать WSDL для принудительного исполнения контракта веб-службы?
------- клиент ---------
<?php
// turn off the WSDL cache
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/~someuser/apams/apams.wsdl");
$fID = 1;
$franchises = $client->getFranchises($fID);
$rid= $franchises["Franchises"][1]["Id"];
$rdesc= $franchises["Franchises"][1]["Description"];
print("The id: $rid\n");
print("The description: $rdesc\n");
?>
--------- сервер -------------
<?php
function getFranchises($pfID)
{
$result = mysql_query("SELECT * FROM tbtest where franchiseID=$pfID");
while($row = mysql_fetch_array($result))
{
$rID=$row['franchiseID'];
$rDesc=$row['franchisedDescription'];
}
mysql_close($con);
return array("Franchises" => array(1=> array("Id"=>$rID, "Description"=>$rDesc)) );
}
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer('apams.wsdl');
$server->addFunction("getFranchises");
$con =mysql_connect("localhost","testuser","******");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
$db_selected=mysql_select_db("testdb", $con);
if (!$db_selected) {
die ('Can\'t use testdb : ' . mysql_error());
}
$server->handle();
?>