Ну вот API, который я пытаюсь использовать: http://www.hotelscombined.com/api/LiveRates.asmx?op=HotelSearch
Вот код, который я пробовал:
$client = new SoapClient('http://www.hotelscombined.com/api/LiveRates.asmx?WSDL'); echo '<pre>'; var_dump($client->__getFunctions()); echo '</pre><br /><br /><br />'; //since the above line returns the functions I am assuming everything is fine but until this point try { $client->__soapCall('HotelSearch', 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' ) ); } catch (Exception $e) { echo $e->getMessage(); }
Anywho это вызывает исключение и эхо:
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(); }
Я нахожу, что при использовании реализации SOAP PHP вы в конечном итоге обертываете все в большее количество массивов, чем считаете нужным.
Приведенный ниже пример, похоже, работает, но также вам необходимо правильно форматировать свои значения даты, прежде чем он будет работать. Я не уверен в лучшем способе сделать это – возможно, вы можете передать Integer, представляющий UNIX time, и 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' ) ) ) );
Одна вещь, которая приводила меня в бешенство в течение нескольких дней – дважды проверьте имена ваших элементов массива (ApiKey, UserId и т. Д.). Убедитесь, что дело верное. Я потратил несколько часов на «неправильно».
Попробуйте создать объект 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);