PHP Soap - не удалось подключиться к хосту - PullRequest
1 голос
/ 19 января 2012

Я искал другие решения для этого, но не могу найти аналогичную проблему:

Этот бит кода работает нормально:

$wsdlUrl = "https://pilot.prove-uru.co.uk/URUws/uru10a.asmx?wsdl";
$client = new soapclient($wsdlUrl);
print_r($client->__getFunctions());

Однако, когда я пытаюсь сделать вызов метода:

$params = array("AddressLookupUK" => array("address" => array("Postcode" => "NE20 9RF"),
            'AccountName' => "xxxx",
            'Password' => "xxxx"));
$result = $client->AddressLookupUK($params);

Я получаю сообщение об ошибке «Исключение SoapFault: [HTTP] Не удалось подключиться к хосту». Если я изменю вызов метода на

$result = $client->FalseMethod($params);

Я получаю "Функция (" FalseMethod ") не является допустимым методом для этой службы", которая показывает, что она подключается, как и ожидалось. У кого-нибудь есть какие-нибудь указатели, которые я могу попробовать?

Спасибо

Ответы [ 4 ]

2 голосов
/ 24 января 2012

Вот код, который я использовал, надеюсь, он кому-нибудь поможет:

$wsdlUrl = "address.wsdl";  


$client = new soapclient($wsdlUrl);
$params = array('address' => array('Postcode' => $postcode, 'BuildingNo' => $buildingNo),
                'AccountName' => 'XXXX',
                'Password' => 'XXXX');              
$result = $client->AddressLookupUK($params);
$echoText = '';
if (is_null($result->AddressLookupUKResult))
{
    //tell the user nothing was returned
}
else
{
    //checks to see if the result set contains only one item
    if (is_array($result->AddressLookupUKResult->URUAddressFixed))
    {
        foreach($result->AddressLookupUKResult->URUAddressFixed as $item)
        {
            //use code like $item->BuildingNo to access the data
        }
    }
    else
    {
        //if there was there was more than one then access using something like
        $result->AddressLookupUKResult->URUAddressFixed->BuildingNo
    }
}

Richard

1 голос
/ 19 января 2012

В WSDL вы видите определение конечной точки:

<wsdl:service name="URU10a">
    <wsdl:port name="URU10aSoap" binding="tns:URU10aSoap">
        <soap:address location="https://pilot.prove-uru.co.uk:8443/URUws/uru10a.asmx"/>
    </wsdl:port>
    <wsdl:port name="URU10aSoap12" binding="tns:URU10aSoap12">
        <soap12:address location="https://pilot.prove-uru.co.uk:8443/URUws/uru10a.asmx"/>
    </wsdl:port>
</wsdl:service>

Думаю, у вас проблемы с подключением порта 8443. В моей сети с ограниченным доступом эта служба также не работает.

EDIT

Хорошо, я попытался подключиться через стандартный порт SSL, изменив WSDL. Я сохранил WSDL из https://pilot.prove -uru.co.uk / URUws / uru10a.asmx? Wsdl на свой жесткий диск, удалил номера портов из определений конечных точек и попытался подключиться с помощью soapUI. Ура, я получил ответ.

Так что, возможно, они переместили службу с 8443 на 443 без обновления WSDL. Или он работает под обоими портами, но вы (и я) не можете подключить 8443 из-за ограничений наших локальных сетей. В любом случае, я думаю, вам следует обратиться к поставщику этой услуги и уточнить этот момент, а не использовать исправленную версию их WSDL.

0 голосов
/ 24 января 2012

Я принял ответ DerVO, так как его указатели помогли мне решить проблему.Номер порта не был полностью причиной проблемы, но я чувствую, возможно, способствовал этому каким-то образом.

При загрузке WSDL в мыльном интерфейсе он без проблем отображал простые и сложные типы объектов, но в PHP это вызывало его падение, т. Е. WSDL определял набор "

Richard

0 голосов
/ 19 января 2012

«Функция (« FalseMethod ») не является допустимым методом для этой службы» ошибка только из-за проверки WSDL.PHP успешно загрузил WSDL, но не может получить к нему доступ к веб-сервисам.

Вы должны отладить Soap Call с trace, установленным в 1:

$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
echo "REQUEST HEADERS:\n" . $client->__getLastRequestHeaders() . "\n";
echo "RESPONSE HEADERS:\n" . $client->__getLastResponseHeaders() . "\n";
echo "Response:\n" . $client->__getLastResponse() . "\n";

Также естьпосмотрите на наборы URL в Wsdl.

...