I'm trying to run a web service using PHP & SOAP, but all I'm getting so far is this:
我尝试使用PHP和SOAP运行web服务,但目前为止我所得到的只是:
(SoapFault)[2] message which states: 'SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://localhost/MyRegistration/login.xml' : failed to load external entity "http://localhost/MyRegistration/login.xml"
[2]消息,该消息声明:“SOAP-ERROR:解析WSDL:无法从”http://localhost/MyRegistration/login装载。xml':未能加载外部实体“http://localhost/MyRegistration/login.xml”
I've tried changing localhost to 127.0.0.1, but that makes no difference. login is actually a wsdl file, but if I put login.wsdl in the SOAPClient constructor, it says "'looks like we got no XML document'" instead.
我尝试将localhost更改为127.0.0.1,但这没有什么区别。登录实际上是一个wsdl文件,但是如果我输入login。在SOAPClient构造函数中,它说“看起来我们没有XML文档”。
Here is my code for the SOAP Client (register_client.php):
下面是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);
}
?>
And here is the login.wsdl file:
这是登录名。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>
And I'm not sure if this is involved, so I'm providing the code for the SOAP Server register.php:
我不确定是否涉及到这一点,所以我提供了SOAP服务器注册器的代码。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();
?>
I'm sorry if I'm giving unnecessary information, but I'm a complete novice at this - and I'd really appreciate it if someone could point out why exactly this SOAP Fault is being generated, and what I can do to rectify it.
如果我提供了不必要的信息,我很抱歉,但我是一个完全的新手——如果有人能指出为什么会产生这个SOAP错误,以及我能做些什么来纠正它,我将非常感激。
I am using WAMP Server version 2.2, with mySQL 5.5.24 and PHP 5.3.13
我使用的是WAMP Server 2.2版本,mySQL 5.5.5.24和PHP 5.3.13
7 个解决方案
#1
22
After migrating to PHP 5.6.5, the soap 1.2 did not work anymore. So I solved the problem by adding optional SSL parameters.
在迁移到PHP 5.6.5之后,soap 1.2不再工作了。因此,我通过添加可选的SSL参数解决了这个问题。
My error:
我的错误:
failed to load external entity
未能加载外部实体
How to solve:
如何解决:
// 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
5
Put this code above any Soap call:
将此代码置于任何Soap调用之上:
libxml_disable_entity_loader(false);
#3
3
On register_client.php make sure that the URL that has been passed to SoapClient is accessible from the machine you're executing the code.
register_client。php确保传递给SoapClient的URL可以从正在执行代码的机器中访问。
$sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl');
If 127.0.0.0 does not work you can try using some network IP address and see.
如果127.0.0.0不起作用,您可以尝试使用一些网络IP地址并查看。
Let me know if it still does not fix it for you, I did try with your example and changing path (making it proper in my dev. environment) has fixed same error for me.
如果它还没有为您修复,请告诉我,我确实尝试了您的示例和更改路径(使它在我的devi环境中是正确的)对我有相同的错误。
I would be interested to know if it does not fix it for you.
我很想知道它是否能帮你修好。
#4
1
I had the same problem.
我也有同样的问题。
This php setting solved my problem:
这个php设置解决了我的问题:
allow_url_fopen -> 1
#5
1
try this. works for me
试试这个。适合我
$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);
#6
0
If anyone has the same problem, one possible solution is to set the bindto
stream context configuration parameter (assuming you're connecting from 11.22.33.44 to 55.66.77.88):
如果有人有同样的问题,一个可能的解决方案是设置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);
#7
0
Got a similar response with https WSDL URL using php soapClient
使用php soapClient获得与https WSDL URL类似的响应
SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from ...
SoapFault exception: [WSDL] SOAP-ERROR:解析WSDL:无法从…
After server has been updated from PHP 5.5.9-1ubuntu4.21 >> PHP 5.5.9-1ubuntu4.23 something went wrong for my client machine osx 10.12.6 / PHP 5.6.30, but MS Web Services Clients connections could be made without issues.
从PHP 5.5.9-1ubuntu4.21 >> > PHP 5.5.9-1ubuntu4.23更新服务器后,我的客户机器osx10.12.6 / PHP 5.6.30出现了问题,但Web服务客户端连接可以没有问题。
Apache2's server_access.log showed no entry when i tried to load WSDL so i added 'cache_wsdl' => WSDL_CACHE_NONE
to prevent client-side wsdl caching, but still got no entries. Finally i tried to load wsdl per CURL -i
checked HEADERS but all seemed to be ok..
输入的server_access。当我尝试加载WSDL时,日志没有显示条目,所以我添加了'cache_wsdl' => WSDL_CACHE_NONE以防止客户端WSDL缓存,但是仍然没有条目。最后,我尝试每卷加载wsdl -我检查了标题,但似乎一切正常。
Only libxml_get_last_error()
provided some insight > SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
只有libxml_get_last_error()提供了一些代码1失败的> SSL操作。OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
So I added some ssl options to my call:
所以我在电话中加入了一些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);
}
In my case 'allow_self_signed' => true
did the trick!
在我的例子中,allow_self_signed' => true做到了!
#1
22
After migrating to PHP 5.6.5, the soap 1.2 did not work anymore. So I solved the problem by adding optional SSL parameters.
在迁移到PHP 5.6.5之后,soap 1.2不再工作了。因此,我通过添加可选的SSL参数解决了这个问题。
My error:
我的错误:
failed to load external entity
未能加载外部实体
How to solve:
如何解决:
// 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
5
Put this code above any Soap call:
将此代码置于任何Soap调用之上:
libxml_disable_entity_loader(false);
#3
3
On register_client.php make sure that the URL that has been passed to SoapClient is accessible from the machine you're executing the code.
register_client。php确保传递给SoapClient的URL可以从正在执行代码的机器中访问。
$sClient = new SoapClient('http://127.0.0.1/MyRegistration/login.wsdl');
If 127.0.0.0 does not work you can try using some network IP address and see.
如果127.0.0.0不起作用,您可以尝试使用一些网络IP地址并查看。
Let me know if it still does not fix it for you, I did try with your example and changing path (making it proper in my dev. environment) has fixed same error for me.
如果它还没有为您修复,请告诉我,我确实尝试了您的示例和更改路径(使它在我的devi环境中是正确的)对我有相同的错误。
I would be interested to know if it does not fix it for you.
我很想知道它是否能帮你修好。
#4
1
I had the same problem.
我也有同样的问题。
This php setting solved my problem:
这个php设置解决了我的问题:
allow_url_fopen -> 1
#5
1
try this. works for me
试试这个。适合我
$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);
#6
0
If anyone has the same problem, one possible solution is to set the bindto
stream context configuration parameter (assuming you're connecting from 11.22.33.44 to 55.66.77.88):
如果有人有同样的问题,一个可能的解决方案是设置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);
#7
0
Got a similar response with https WSDL URL using php soapClient
使用php soapClient获得与https WSDL URL类似的响应
SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from ...
SoapFault exception: [WSDL] SOAP-ERROR:解析WSDL:无法从…
After server has been updated from PHP 5.5.9-1ubuntu4.21 >> PHP 5.5.9-1ubuntu4.23 something went wrong for my client machine osx 10.12.6 / PHP 5.6.30, but MS Web Services Clients connections could be made without issues.
从PHP 5.5.9-1ubuntu4.21 >> > PHP 5.5.9-1ubuntu4.23更新服务器后,我的客户机器osx10.12.6 / PHP 5.6.30出现了问题,但Web服务客户端连接可以没有问题。
Apache2's server_access.log showed no entry when i tried to load WSDL so i added 'cache_wsdl' => WSDL_CACHE_NONE
to prevent client-side wsdl caching, but still got no entries. Finally i tried to load wsdl per CURL -i
checked HEADERS but all seemed to be ok..
输入的server_access。当我尝试加载WSDL时,日志没有显示条目,所以我添加了'cache_wsdl' => WSDL_CACHE_NONE以防止客户端WSDL缓存,但是仍然没有条目。最后,我尝试每卷加载wsdl -我检查了标题,但似乎一切正常。
Only libxml_get_last_error()
provided some insight > SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
只有libxml_get_last_error()提供了一些代码1失败的> SSL操作。OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
So I added some ssl options to my call:
所以我在电话中加入了一些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);
}
In my case 'allow_self_signed' => true
did the trick!
在我的例子中,allow_self_signed' => true做到了!