Скоро ми се наложи да консумирам от един webservice написан на .NET, като за целта трявбаше да използвам Nusoap. Мислих си, че всичко ще стане, както с консумацията от сървъри, написани на други езици, но за съжеление .NET изисква особенни неща. Какво се получи: изпращам данните към сървъра, но винаги ми дава грешка, че сървъра не получава данни и че трябва да попълня задължителните поле. Започнах да търся в интернет за решения на проблема, но за съжеление първите пъти не намерих нищо. С течение на времето, чрез специфизиране на търсенето намерих един сайт, в който беше обяснено, че за .NET трявба да се правят специални хватки, за да може да се консумира от даден сървиз. Затова реших да напиша един кратък урок, който може би ще помогне на други програмисти, които имат или ще имат подобен проблем.
Нека разгледаме един пример с един WSDL файл, който да кажем изглежда по следния начин:
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| <definitions targetNamespace="http://domain.com/webservices/">
.
.
.
<s:element name="CheckLogin">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ID" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="AccountData" type="s0:AccountData"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="AccountData">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string"/>
</s:sequence>
</s:complexType>
.
.
.
</definitions> |
След като погледнах WSDL файла, ведна разбрах какво трябва да се прави и написах следния код:
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| <?php
require_once ('nusoap.php');
define('WEBSERVICE_ENDPOINT', ' https://webservice.domain.com/api/wsapi.asmx?WSDL');
define('WEBSERVICE_ID', 'xxxxx');
define('WEBSERVICE_USERNAME', 'xxxxx');
define('WEBSERVICE_PASSWORD', 'xxxxx');
$client = new soapclient(WEBSERVICE_ENDPOINT, true);
$error = $client->getError();
if ($error) {
echo $error;
}
$login_data = array (
'Username' => WEBSERVICE_USERNAME,
'Password' => WEBSERVICE_PASSWORD
);
$params = array (
"ID" => WEBSERVICE_ID,
"AccountData" => $login_data
);
$result = $client->call('CheckLogin', array (
'name' => $params
));
if ($client->fault) {
echo "Faultcode: " . $result['faultcode'] . "<br>";
echo "Faultstring: " . $result['faultstring'] . "<br>";
} else {
$err = $client->getError();
if ($err) {
echo $err;
} else {
echo "<pre>";
var_dump($result);
echo "</pre>";
}
}
?> |
Но какво се оказа? Сървърът постоянно ми връщаше грешка и ми казваше, че ID-то е задалжително поле и трябва да въведа съответната стойност. Все пак от кода се вижда че изпращам стойност за ID, но въпреки това не става! Както по-горе споменах започнах да търся в интернет за решение на проблема и разбира се намерих.
Ето и кода, който трябва да реши съответния проблем за консумирането на .NET webservices чрез nusoap.
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <?php
require_once ('nusoap.php');
define('WEBSERVICE_ENDPOINT', ' https://webservice.domain.com/api/wsapi.asmx');
define('WEBSERVICE_ID', 'xxxxx');
define('WEBSERVICE_USERNAME', 'xxxxx');
define('WEBSERVICE_PASSWORD', 'xxxxx');
$body = '<CheckLogin xmlns="http://domain.com/webservices/">
<ID>' . WEBSERVICE_ID . '</ID>
<AccountData>
<Username>' . WEBSERVICE_USERNAME . '</Username>
<Password>' . WEBSERVICE_PASSWORD . '</Password>
</AccountData>
</CheckLogin>';
$proxyClient = new soapclient(WEBSERVICE_ENDPOINT);
$proxyClient->debug_flag = true;
$msg = $proxyClient->serializeEnvelope($body);
$proxyClient->send($msg, 'http://domain.com/webservices/CheckLogin');
$result = $proxyClient->document;
echo "<pre>";
var_dump($result);
echo "</pre>";
?> |
Надявам се да съм спестил главоболие на много програмисти, които са срещали този проблем и все още търсят решение!