SOAP - Сървър
Нашият сървър няма да прави нищо по различно от запитване към базатаданни на базата на получена информация. По-сложното тук е дефинирането на типовете на получени и изпратени данни. Точно това ще разгледаме по-обстойно!
Импортираме нашия клас nusoap.php.
CODE1
| require_once('nusoap.php'); |
Създаване инстанция на класа soap_server
CODE1
| $server = new soap_server(); |
Инициализиране и дефиниране на
WSDL файла
CODE1
2
3
4
5
| // Initialize WSDL support
$server->configureWSDL('BooksInterface', 'urn:BooksInterface');
// Put the WSDL schema types in the namespace with the tns prefix
$server->wsdl->schemaTargetNamespace = 'urn:BooksInterface'; |
Дефиниране на сложните типове данни
Както споменахме по-горе трябва да използваме масиви за транспортиране на получената и предадената информация. Дефинирането изглежда по следния начин:
CODE1
2
3
4
5
6
7
8
9
10
| $server->wsdl->addComplexType(
'ArrayOfstring',
'complexType',
'array',
'',
'',
array(),
array(array('ref'=>'SOAP-ENC:Array','wsdl:arrayType'=>'xsd:string[]')),
'xsd:string'
); |
Сега дефинирахме един масив от стрингове, който може да съдържа като стойности заглавия на книги, ключови думи и имена на автори.
Дефиниране на изходните данни, които ще се връщат като резултат от функцията
CODE1
2
3
4
5
6
7
8
9
10
11
12
| $server->wsdl->addComplexType(
'BooksResponse',
'complexType',
'struct',
'all',
'',
array(
'title' => array('name' => 'title', 'type' => 'xsd:string'),
'author' => array('name' => 'author', 'type' => 'xsd:string'),
'isbn' => array('name' => 'isbn', 'type' => 'xsd:string')
)
); |
BookResponse съдържа трите полета, които ще съдържат необходимата информация за дадена книга. Тъй като обаче ще трябва да изпращаме няколко на брой книги, то тогава ще дефинираме един масив за тази информация.
CODE1
2
3
4
5
6
7
8
9
10
| $server->wsdl->addComplexType(
'BooksResponseArray',
'complexType',
'array',
'',
'',
array(),
array(array('ref'=>'SOAP-ENC:Array','wsdl:arrayType'=>'tns:BooksResponse[]')),
'tns:BooksResponse'
); |
След като дефинирахме комплексната структура на данните, нека продължим нататък с регистрирането на необходимата функция.
CODE1
2
3
4
5
6
7
8
9
| $server->register('BookInformation', // method name
array('queryarray' => 'tns:ArrayOfstring'), // input parameters
array('return' => 'tns:BooksResponseArray'), // output parameters
'urn:BooksInterface', // namespace
'urn:BooksInterface#BookInformation', // soapaction
'rpc', // style
'encoded', // use
'Get information about books' // documentation
); |
Като последно ще създадем нашата функция, която ще обработва информацията и ще предостави подробна информация за запитването.
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| function BookInformation($queryarray)
{
mysql_connect("localhost", "root", "");
mysql_select_db("test");
$books = array();
foreach ($queryarray as $value)
{
$sql = mysql_query("SELECT title, author, isbn FROM books WHERE title LIKE '%".$value."%' OR author LIKE '".$value."'");
$i=0;
while($row = mysql_fetch_array($sql))
{
$books[] = array(
'title' => $row['title'],
'author' => $row['author'],
'isbn' => $row['isbn']
);
$i++;
}
}
mysql_close();
return $books;
} |
Какво прави тази функция?
При получаване на масив, функцията прочита елементите на масива и същевременно създава запитвания към базата за данни и проверява дали има съответствия със стойностите от масива. В случай че има резултати те се записват в двумерния масив $books, който е връщаща стойност на функцията.
След като създадохме нашия сървър, нека да разработим и необходимия клиент за запитването и да направим едно пробно запитване.