SOAP PHP разбор ошибок WSDL: не удалось загрузить внешний объект?
Я пытаюсь запустить веб-сервис с использованием PHP и SOAP, но все, что я пока получаю, это:
(SoapFault) [2] сообщение, которое гласит: "SOAP-ERROR: синтаксический анализ WSDL: не удалось загрузить из" http://localhost/MyRegistration/login.xml ": не удалось загрузить внешний объект" http://localhost/MyRegistration/login.xml "
Я попытался изменить localhost на 127.0.0.1, но это не имеет значения. login - это на самом деле файл wsdl, но если я добавлю login.wsdl в конструктор SOAPClient, он скажет: "похоже, у нас нет XML-документа".
Вот мой код для SOAP-клиента (register_client.php):
<?php
try
{
$sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl');
$param1 = $_POST["regname"];
$param2 = $_POST["regpass1"];
$response = $sClient->loginVerify($param1, $param2);
var_dump($response);
}
catch(SoapFault $e)
{
var_dump($e);
}
?>
А вот и файл login.wsdl:
<?xml version="1.0"?>
<definitions name="LoginVal"
targetNamespace="urn:LoginVal"
xmlns:tns="urn:LoginVal"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Login">
<xsd:element name="getName" type="xsd:string" />
<xsd:element name="getPass" type="xsd:string" />
<xsd:element name="LoginResponse" type="xsd:string" />
</xsd:schema>
</types>
<message name="loginVerify">
<part name="username" type="tns:getName" />
<part name="password" type="tns:getPass" />
</message>
<message name="doLoginResponse">
<part name="return" type="tns:LoginResponse" />
</message>
<portType name="LoginPort">
<operation name="loginVerify">
<input message="tns:loginVerify" />
<output message="tns:doLoginResponse" />
</operation>
</portType>
<binding name="LoginBinding" type="tns:LoginPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="loginVerify">
<soap:operation soapAction="urn:LoginAction" />
<input>
<soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:Login" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="LoginService">
<port name="LoginPort" binding="tns:LoginBinding">
<soap:address location="http://localhost/MyRegistration/register.php" />
</port>
</service>
</definitions>
И я не уверен, что это происходит, поэтому я предоставляю код для SOAP-сервера register.php:
<?php
if(!extension_loaded("soap"))
{
dl("php_soap.dll");
}
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("login.wsdl", array('uri'=>'http://127.0.0.1/MyRegistration'))
public function loginVerify($username, $password)
{
if($_POST["regname"] && $_POST["regemail"] && $_POST["regpass1"] && $_POST["regpass2"] )
{
if($_POST["regpass1"] == $_POST["regpass2"])
{
$servername = "localhost";
$username = "root";
$password = "Hellfire";
$conn = mysql_connect($servername,$username,"Hellfire")or die(mysql_error());
mysql_select_db("soap",$conn);
$sql = "insert into users (name,email,password)values('$_POST[regname]','$_POST[regemail]','$_POST[regpass1]')";
$result = mysql_query($sql,$conn) or die(mysql_error());
return "You have registered sucessfully";
//print "<a href='index.php'>go to login page</a>";
}
else return "passwords dont match";
}
else return "invalid data";
}
$server->AddFunction("loginVerify");
$server->handle();
?>
Мне жаль, если я даю ненужную информацию, но я в этом новичок - и я был бы очень признателен, если бы кто-то мог указать, почему именно генерируется эта ошибка SOAP, и что я могу сделать, чтобы исправить Это.
Я использую WAMP Server версии 2.2 с mySQL 5.5.24 и PHP 5.3.13
Ответы
Ответ 1
После перехода на PHP 5.6.5 мыло 1.2 больше не работало. Поэтому я решил проблему, добавив дополнительные параметры SSL.
Моя ошибка:
не удалось загрузить внешний объект
Как решить:
// options for ssl in php 5.6.5
$opts = array(
'ssl' => array(
'ciphers' => 'RC4-SHA',
'verify_peer' => false,
'verify_peer_name' => false
)
);
// SOAP 1.2 client
$params = array(
'encoding' => 'UTF-8',
'verifypeer' => false,
'verifyhost' => false,
'soap_version' => SOAP_1_2,
'trace' => 1,
'exceptions' => 1,
'connection_timeout' => 180,
'stream_context' => stream_context_create($opts)
);
$wsdlUrl = $url . '?WSDL';
$oSoapClient = new SoapClient($wsdlUrl, $params);
Ответ 2
Поместите этот код над любым вызовом мыла:
libxml_disable_entity_loader(false);
Ответ 3
На register_client.php убедитесь, что URL, который был передан SoapClient, доступен с компьютера, на котором выполняется код.
$sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl');
Если 127.0.0.0 не работает, вы можете попробовать использовать какой-либо сетевой IP-адрес и посмотреть.
Сообщите мне, если он по-прежнему не исправит это для вас, я попытался с вашим примером и изменить путь (что делает его правильным в моей среде разработчиков) зафиксировал для меня ту же ошибку.
Мне было бы интересно узнать, не исправляет ли он это для вас.
Ответ 4
попробуйте это. работает для меня
$options = array(
'cache_wsdl' => 0,
'trace' => 1,
'stream_context' => stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
))
$client = new SoapClient(url, $options);
Ответ 5
У меня была та же проблема.
Эта настройка php решила мою проблему:
allow_url_fopen -> 1
Ответ 6
Получил аналогичный ответ с https WSDL URL с использованием php soapClient
Исключение SoapFault: [WSDL] ОШИБКА SOAP: Синтаксический анализ WSDL: Не удалось загрузить из...
После того, как сервер был обновлен с PHP 5.5.9-1ubuntu4.21 >> PHP 5.5.9-1ubuntu4.23 что-то пошло не так для моей клиентской машины osx 10.12.6/PHP 5.6.30, но подключения клиентов MS Web Services могут быть сделаны без проблем.
Apache2 server_access.log не показывал записи, когда я пытался загрузить WSDL, поэтому я добавил 'cache_wsdl' => WSDL_CACHE_NONE
чтобы предотвратить кэширование wsdl на стороне клиента, но все равно не получил записей. Наконец, я попытался загрузить wsdl в CURL -i
проверенными CURL -i
но все вроде бы было нормально..
Только libxml_get_last_error()
предоставил некоторую информацию> SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Поэтому я добавил несколько опций ssl к своему звонку:
$contextOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
));
$sslContext = stream_context_create($contextOptions);
$params = array(
'trace' => 1,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'stream_context' => $sslContext
);
try {
$proxy = new SoapClient( $wsdl_url, $params );
} catch (SoapFault $proxy) {
var_dump(libxml_get_last_error());
var_dump($proxy);
}
В моем случае 'allow_self_signed' => true
сделал свое дело!
Ответ 7
Если у кого-то есть одна и та же проблема, одним из возможных решений является установка параметра конфигурации контекста потока bindto
(при условии, что вы подключаетесь от 11.22.33.44 до 55.66.77.88):
$context = [
'socket' => [
'bindto' => '55.66.77.88'
]
];
$options = [
'soapVersion' => SOAP_1_1,
'stream_context' => stream_context_create($context)
];
$client = new Client('11.22.33.44', $options);
Ответ 8
Просто была похожая проблема при попытке использования SoapClient. Все работало нормально, но в процессе производства, иногда при обновлении страницы, я получал сообщение об ошибке "Исключение SoapFault: [WSDL] SOAP-ERROR: Синтаксический анализ WSDL: не удалось загрузить из..".
Я использовал параметры:
new \SoapClient($WSDL, array('cache_wsdl' => WSDL_CACHE_NONE, 'trace' => true, "exception" => 0));
Удаление всех параметров сработало для меня:
new \SoapClient($WSDL);
Ответ 9
Проблема может заключаться в том, что вы не включили расширение openssl в своем файле php.ini
перейдите в конец файла php.ini и удалите ;
в строке, где extension=openssl
равно
Конечно, в коде вопроса есть часть кода, отвечающая за проверку, загружено ли расширение или нет, но, возможно, некоторые неосторожно забудут об этом
Ответ 10
Я использую selinux, и с помощью следующей команды оболочки (от имени root) я смог разрешить PHP выполнять вызовы SOAP:
sudo setsebool -P httpd_can_network_connect on