веб-сервисы — PHP делает запрос клиента SOAP возвращает 500 Внутренняя ошибка сервера

Я использую PHP, чтобы сделать запрос SOAP. У меня есть информация о веб-сервисе от третьей стороны. В основном то, что они дают мне:

  1. Полный запрос URI ( Http: //xx.xx.xx.xx: хххххх / некоторые / услуги / BasicDo )
  2. имя пользователя & пароль

Я довольно новичок, однако я мог немного понять, как работают 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. Кто-нибудь, пожалуйста, объясните мне это. Заранее спасибо.

0

Решение

К сожалению похоже независимо от того, что вы пытаетесь (например, прохождение 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.

5

Другие решения

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

$client = new SoapClient("http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl", array('login'=>"myusername",'password'=> "mypwd"));

Что вы можете сделать:

  1. Создайте файл PHP. Назовите это как угодно. Напишите следующий код:

    ini_set ( ‘display_errors’, ‘On’);

    $ client = new SoapClient («Http: //xx.xx.xx.xx: ххххх / некоторые / услуги / BasicDo WSDL«, array (‘login’ =>» myusername «, ‘password’ =>» mypwd «));
    var_dump ($ клиент);
    выход;

  2. Запустите файл.

  3. Скорее всего, это покажет вам необходимое исключение.

В моем случае наш сервер использовал прокси, который я не передал в параметрах, из-за которых у меня возникла проблема.
Дайте нам знать, как оно идет.

Спасибо

1

Добавьте эти коды в начало файла, чтобы увидеть, где произошла ошибка

ini_set('display_errors','1');
error_reporting(E_ALL);
1

Прежде всего вам необходимо убедиться, что у вас есть доступ к SOAP-серверу.

С компьютера, на котором работает ваш php-скрипт, попробуйте получить доступ к файлу wsdl и проверьте, действителен ли он.

Вы можете, например, использовать wget http://xx.xx.xx.xx:xxxxx/some/services/BasicDo?wsdl затем откройте сохраненный файл и посмотрите, что вы получаете. Это действительный WSDL?

После того, как вы разобрались с нашим доступом, вам нужно прочитать документацию Вот а также Вот. Вам может потребоваться пройти аутентификацию по-другому или передать другие параметры.

Что касается того, почему блок catch не обрабатывает ваше исключение, вы только ловите SoapFault, Внутренняя ошибка сервера 500 может быть вызвана чем угодно.

0

Я действительно ценю все ответы. Я на самом деле работаю с другой стороной, к которой у меня нет доступа на удаленной стороне. Моя задача — сделать SOAP-запрос к серверу. Однако оказалось, что веб-сервис для меня НЕТ. Поэтому я в конечном итоге использовал cURL для отправки необработанного запроса SOAP POST. 🙂

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector