Возникли проблемы с освоением SOAP в PHP - PullRequest
3 голосов
/ 22 июня 2009

Ну вот API, который я пытаюсь использовать: http://www.hotelscombined.com/api/LiveRates.asmx?op=HotelSearch

Вот код, который я пробовал:

<code>$client = new SoapClient('http://www.hotelscombined.com/api/LiveRates.asmx?WSDL');

echo '<pre>'; var_dump($client->__getFunctions()); echo '



'; // поскольку вышеприведенная строка возвращает функции, я предполагаю, что все в порядке, но до этого момента пытаться { $ Клиент -> __ soapCall ( 'HotelSearch', массив ( 'ApiKey' => 'THE_API_KEY_GOES_HERE', // обратите внимание, что в фактическом коде я поместил ключ API в ... 'UserID' => session_id (), 'UserAgent' => $ _SERVER ['HTTP_USER_AGENT'], 'UserIPAddress' => $ _SERVER ['REMOTE_ADDR'], 'HotelID' => '50563', 'Checkin' => '07 / 02/2009 ', 'Checkout' => '07 / 03/2009 ', 'Гости' => '2', 'Rooms' => '1', 'LanguageCode' => 'en', 'DisplayCurrency' => 'usd', 'TimeOutInSeconds' => '90' ) ); } поймать (исключение $ e) { echo $ e-> getMessage (); }

В любом случае это вызывает исключение и повторяет следующее:

Server was unable to process request. ---> Object reference not set to an instance of an object.

ПРИМЕЧАНИЕ: я никогда раньше не использовал SOAP, поэтому возможно, что я просто делаю что-то в корне неправильно, даже небольшой совет, чтобы направить меня в правильном направлении, был бы очень признателен

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

try
{
    $client->__soapCall('HotelSearch',
        array('request' =>
        array(
            'ApiKey' => 'THE_API_KEY_GOES_HERE', // note that in the actual code I put the API key in...
            'UserID' => session_id(),
            'UserAgent' => $_SERVER['HTTP_USER_AGENT'],
            'UserIPAddress' => $_SERVER['REMOTE_ADDR'],
            'HotelID' => '50563',
            'Checkin' => '2009-07-02',
            'Checkout' => '2009-07-03',
            'Guests' => 2,
            'Rooms' => 1,
            'LanguageCode' => 'en',
            'DisplayCurrency' => 'usd',
            'TimeOutInSeconds' => 90
        ) )
    );
}
catch (Exception $e)
{
    echo $e->getMessage();
}

Ответы [ 3 ]

4 голосов
/ 22 июня 2009

Я обнаружил, что при использовании реализации SOAP в PHP вы все оборачиваете в большее количество массивов, чем считаете нужным.

Кажется, что приведенный ниже пример работает, но вам также нужно правильно отформатировать значения даты, прежде чем это сработает. Я не уверен в лучшем способе сделать это - возможно, вы можете передать целое число, представляющее время UNIX, и PHP преобразует его для вас.

$client->__soapCall('HotelSearch', 
    array(
        array('request' => 
            array(
                'ApiKey' => 'THE_API_KEY_GOES_HERE', // note that in the actual code I put the API key in...
                'UserID' => session_id(),
                'UserAgent' => $_SERVER['HTTP_USER_AGENT'],
                'UserIPAddress' => $_SERVER['REMOTE_ADDR'],
                'HotelID' => '50563',
                'Checkin' => '07/02/2009',
                'Checkout' => '07/03/2009',
                'Guests' => '2',
                'Rooms' => '1',
                'LanguageCode' => 'en',
                'DisplayCurrency' => 'usd',
                'TimeOutInSeconds' => '90'
            ) 
        ) 
    )
);
1 голос
/ 23 июня 2009

Одна вещь, которая сводила меня с ума в течение многих дней - перепроверьте имена элементов вашего массива (ApiKey, UserId и т. Д.). Убедитесь, что дело также верно. Я потратил впустую часы на неправильно 'm'.

0 голосов
/ 12 июля 2009

Попробуйте создать объект PHP, а затем сослаться на этот объект в своем вызове мыла.

class HotelRequest {
   public $apiKey;
   public $userID;
   public $userAgent;
   public $userIPAddress;
   public $hotelID;
   public $checkin;
   public $checkout;
   public $guests;
   public $rooms;
   public $languageCode;
   public $displayCurrency;
   public $timeOutInSeconds;  
}

//set the values of the object...
$hotelRequestObject = new HotelRequest();
$hotelRequestObject->apiKey = "API_KEY";
//etc...

$client = new SoapClient('http://www.hotelscombined.com/api/LiveRates.asmx?WSDL',
    array("classmap" => array("HotelSearchRequest" => "HotelRequest")));

$result = $client->HotelSearch($hotelRequestObject);

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