Почему мой конверт SOAP пуст? - PullRequest
0 голосов
/ 11 ноября 2011

Итак, я пытаюсь вызвать веб-сервис с помощью PHP и SOAP, но, похоже, он делает это неправильно, и я не могу понять, почему. Вот PHP:

$client = new SoapClient($wsdl, array('trace' => 1));
print_r($client->__getFunctions());
$params->param1 = "satsys";
$params->param2 = "0A259772-983C-4EFB-834E-6184F8E9F4E7";
$params->param3 = null;
$response = $client->SetHardwareProfile($params);
var_dump($response);
echo "Last Request: ".$client->__getLastRequest();
echo "Last Response: ".$client->__getLastResponse();

А вот и вывод:

Array
(
    [0] => ValidateLicenseKeyResponse ValidateLicenseKey(ValidateLicenseKey $parameters)
    [1] => CreateProviderResponse CreateProvider(CreateProvider $parameters)
    [2] => SetHardwareProfileResponse SetHardwareProfile(SetHardwareProfile $parameters)
    [3] => UpdateCurrentVersionResponse UpdateCurrentVersion(UpdateCurrentVersion $parameters)
    [4] => SoftwareUpdateAvailableResponse SoftwareUpdateAvailable(SoftwareUpdateAvailable $parameters)
    [5] => GetSoftwareUpdateResponse GetSoftwareUpdate(GetSoftwareUpdate $parameters)
)
object(stdClass)#3 (1) {
  ["SetHardwareProfileResult"]=>
  bool(false)
}

И XML:

<?xml version="1.0" encoding="UTF-8"?>
<!--Last Request:-->
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
<ns1:SetHardwareProfile/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<!--Last Response:-->
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<SetHardwareProfileResponse xmlns="http://tempuri.org/">
<SetHardwareProfileResult>false</SetHardwareProfileResult>
</SetHardwareProfileResponse>
</s:Body>
</s:Envelope>

Теперь из того, что я прочитал, проблема заключается в том, что этот запрос, потому что вместо того, чтобы выглядеть так, он должен выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
<SOAP-ENV:Body>
<ns1:SetHardwareProfile>
    <customerId xsi:type="xsd:string">satsys</customerId>
    <providerGuid xsi:type="xsd:string">0A259772-983C-4EFB-834E-6184F8E9F4E7</providerGuid>
    <other xsi:type="xsd:string"></other>
</ns1:SetHardwareProfile>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Вот хороший сервисный контракт (написанный на C #):

using System;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Collections.Generic;

namespace ProviderSync
{
    [ServiceContract]
    public interface IProviderSync
    {
        [OperationContract]
        bool SetHardwareProfile(String customerId, String providerGuid, List<Device> hardware);
    }
}

1 Ответ

0 голосов
/ 14 ноября 2011

Хорошо, проблема в том, что в SOAP, в отличие от других языков, параметры должны иметь свои точные имена. Таким образом, приведенный выше фрагмент кода PHP должен выглядеть следующим образом:

$client = new SoapClient($wsdl, array('trace' => 1));
print_r($client->__getFunctions());
$params->customerId = "satsys";
$params->providerGuid = "0A259772-983C-4EFB-834E-6184F8E9F4E7";
$params->hardware = null;
$response = $client->SetHardwareProfile($params);
var_dump($response);
echo "Last Request: ".$client->__getLastRequest();
echo "Last Response: ".$client->__getLastResponse();

Потому что они объявлены сервисным контрактом как:

bool SetHardwareProfile(String customerId, String providerGuid, List<Device> hardware);

Я не уверен, почему это именно так, или так происходит во всех формах вызовов SOAP, но это изменение устранило эту проблему для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...