我正在尝试使用PHP&运行Web服务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 Fault,我真的很感激做纠正它。
我正在使用WAMP Server 2.2版,mySQL 5.5.24和PHP 5.3.13
答案 0 :(得分:25)
迁移到PHP 5.6.5后,soap 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);
答案 1 :(得分:6)
将此代码置于任何Soap调用之上:
libxml_disable_entity_loader(false);
答案 2 :(得分:3)
在register_client.php上,确保可以从正在执行代码的计算机访问传递给SoapClient的URL。
$sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl');
如果127.0.0.0不起作用,您可以尝试使用某些网络IP地址并查看。
请告诉我,如果它仍然没有为您修复,我确实尝试了您的示例并更改路径(在我的开发环境中使其正确)已为我修复了相同的错误。
我很想知道它是否适合你。
答案 3 :(得分:2)
我遇到了同样的问题。
这个php设置解决了我的问题:
allow_url_fopen -> 1
答案 4 :(得分:2)
试试这个。适合我
$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 :(得分:1)
使用php soapClient
获得与https WSDL URL类似的响应SoapFault异常:[WSDL] SOAP-ERROR:解析WSDL:无法从...加载
从PHP 5.5.9-1ubuntu4.21&gt;&gt;更新服务器后PHP 5.5.9-1ubuntu4.23我的客户端机器osx 10.12.6 / PHP 5.6.30出了问题,但是可以毫无问题地建立MS Web服务客户端连接。
当我尝试加载WSDL时,Apache2的server_access.log没有显示任何条目,因此我添加了'cache_wsdl' => WSDL_CACHE_NONE
以防止客户端wsdl缓存,但仍然没有条目。最后我试着加载每CURL -i
个HEADERS的wsdl,但一切似乎都没问题。
只有libxml_get_last_error()
提供了一些见解&gt; 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
做了伎俩!
答案 6 :(得分:1)
我正在使用selinux并通过以下shell命令(以root用户身份)能够允许PHP进行SOAP调用:
sudo setsebool -P httpd_can_network_connect on
答案 7 :(得分:1)
如果使用docker,则由于OpenSSL默认安全级别,您可能会出错。
您需要将/etc/ssl/openssl.cnf
中的秒级从DEFAULT@SECLEVEL=2
降低到DEFAULT@SECLEVEL=1
或者只是添加到Dockerfile
RUN sed -i "s|DEFAULT@SECLEVEL=2|DEFAULT@SECLEVEL=1|g" /etc/ssl/openssl.cnf
来源:https://github.com/dotnet/runtime/issues/30667#issuecomment-566482876
更改之后,我可以运行SoapClient而无需任何其他选项
您可以通过在容器上运行来进行验证
curl -A 'cURL User Agent' -4 https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/Auth?wsdl
答案 8 :(得分:0)
如果有人遇到同样的问题,一种可能的解决方案是设置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);
答案 9 :(得分:0)
尝试使用SoapClient时遇到类似的问题。 一切工作正常,但是在生产中,有时在页面刷新时,我会收到“ SoapFault异常:[WSDL] SOAP-ERROR:解析WSDL:无法从..加载”错误。
我正在使用参数:
new \SoapClient($WSDL, array('cache_wsdl' => WSDL_CACHE_NONE, 'trace' => true, "exception" => 0));
删除所有参数对我有用:
new \SoapClient($WSDL);
答案 10 :(得分:0)
问题可能出在您未在php.ini文件中启用openssl扩展
转到您的php.ini文件末尾,将;
所在的行中的extension=openssl
删除
当然,在有问题的代码中,有一部分代码负责检查是否已加载扩展,但是可能有些谨慎地将其遗忘了
答案 11 :(得分:0)
我遇到了同样的问题,我成功添加:
new \SoapClient(URI WSDL OR NULL if non-WSDL mode, [
'cache_wsdl' => WSDL_CACHE_NONE,
'proxy_host' => 'URL PROXY',
'proxy_port' => 'PORT PROXY'
]);
希望获得帮助:)