Я использую PHP, чтобы сделать запрос SOAP. У меня есть информация о веб-сервисе от третьей стороны. В основном то, что они дают мне:
Я довольно новичок, однако я мог немного понять, как работают PHP SOAP. Однако в примере я обнаружил, что URL-адрес называется http://xx.xx.xx.xx/services/myservice?wsdl
что не совсем то, что я имею со мной. Дополнительный вопрос здесь, что я должен задать им? Возможно, как называется файл wsdl?
Также до сих пор у меня есть этот код со мной:
try{
$client = new SoapClient("http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl", array('login'=>"myusername",'password'=> "mypwd"));
}
catch(SoapFault $fault) {
trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}
Но из консоли я получил статус 500 Internal Server Error. Я не знаю, как это может быть, я ожидаю что-то от блока catch. Кто-нибудь, пожалуйста, объясните мне это. Заранее спасибо.
К сожалению похоже независимо от того, что вы пытаетесь (например, прохождение array('exceptions' => 0)
, SoapClient()
сгенерирует uncatchable E_ERROR при проблемах сетевого подключения. Эта ошибка все еще присутствует до PHP 5.5.4 (REF).
Резюме:
Тестовый скрипт:
$client=@new SoapClient('garbage',array('exceptions'=>FALSE));
echo 'OK';
Ожидаемый результат: мы должны увидеть «ОК»,
Фактический результат:
Если мы используем register_shutdown_function
отображать содержимое error_get_last()
, мы получаем:
Array
(
[type] => 1
[message] => SOAP-ERROR: Parsing WSDL: Couldn't load from 'garbage' : failed
to load external entity "garbage")
Чтобы объяснить, почему вы вдруг получили эту ошибку, ничего не меняя в своей системе, и объяснить, почему SoapClient работает на вашем локальном компьютере, а не на вашей производственной системе, скорее всего, это брандмауэр вопрос.
Вот что другое человек сообщил, что решил свою проблему:
Я решил свою проблему. Это была проблема с моим брандмауэром.
брандмауэр отбрасывал пакеты, отправленные через PHP, но через curl или wget
не сбрасывается Я добавил правило для всего трафика с этого сервера и
увеличена длина отбрасывания пакетов, и теперь все работает отлично!
Мой лучший совет на данный момент — написать код в том же PHP-файле, который проверяет, разрешается ли URL-адрес службы SOAP и загружается ли он правильно. до вызывая SoapClient.
Я не уверен, что проблема может быть, но я сделал следующее, чтобы отладить эту проблему, когда я столкнулся с ней
$client = new SoapClient("http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl", array('login'=>"myusername",'password'=> "mypwd"));
Что вы можете сделать:
Создайте файл PHP. Назовите это как угодно. Напишите следующий код:
ini_set ( ‘display_errors’, ‘On’);
$ client = new SoapClient («Http: //xx.xx.xx.xx: ххххх / некоторые / услуги / BasicDo WSDL«, array (‘login’ =>» myusername «, ‘password’ =>» mypwd «));
var_dump ($ клиент);
выход;
Запустите файл.
В моем случае наш сервер использовал прокси, который я не передал в параметрах, из-за которых у меня возникла проблема.
Дайте нам знать, как оно идет.
Спасибо
Добавьте эти коды в начало файла, чтобы увидеть, где произошла ошибка
ini_set('display_errors','1');
error_reporting(E_ALL);
Прежде всего вам необходимо убедиться, что у вас есть доступ к SOAP-серверу.
С компьютера, на котором работает ваш php-скрипт, попробуйте получить доступ к файлу wsdl и проверьте, действителен ли он.
Вы можете, например, использовать wget http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl
затем откройте сохраненный файл и посмотрите, что вы получаете. Это действительный WSDL?
После того, как вы разобрались с нашим доступом, вам нужно прочитать документацию Вот а также Вот. Вам может потребоваться пройти аутентификацию по-другому или передать другие параметры.
Что касается того, почему блок catch не обрабатывает ваше исключение, вы только ловите SoapFault
, Внутренняя ошибка сервера 500 может быть вызвана чем угодно.
Я действительно ценю все ответы. Я на самом деле работаю с другой стороной, к которой у меня нет доступа на удаленной стороне. Моя задача — сделать SOAP-запрос к серверу. Однако оказалось, что веб-сервис для меня НЕТ. Поэтому я в конечном итоге использовал cURL для отправки необработанного запроса SOAP POST. 🙂