美好的一天,读者。
我的任务是构建一个PHP SOAP服务器来接收VB客户端通过WinHttp.WinHttpRequest对象发送的xml。我正在使用nuSoap作为php服务器,它到现在还没有工作。
vb客户端发送的xml包含需要与其他nessecary变量一起使用的已定义的webservice,这就是为什么在vb代码中没有种植soapaction的原因。 '他们'想要这样:'(
soap服务器确实发送了对vb的响应:
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-
ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode>
<faultactor xsi:type="xsd:string"></faultactor>
<faultstring xsi:type="xsd:string">Operation '' is not defined in the WSDL for this service</faultstring>
<detail xsi:type="xsd:string"></detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
发送xml的vb客户端:
Private Sub Command2_Click()
mydata = "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf
mydata = mydata & "<root>" & vbCrLf
mydata = mydata & "<SERVICE>SayHello</SERVICE>" & vbCrLf
mydata = mydata & "<NAME>Noobula</NAME>" & vbCrLf
mydata = mydata & "</root>" & vbCrLf
Set w = CreateObject("WinHttp.WinHttpRequest.5.1")
w.Open "POST", "http://127.0.0.1:80/soapvb/terimaxml.php"
w.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
w.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = 13056
w.Send mydata
respo = w.ResponseText
Text1 = respo
End Sub
最后,服务器本身:
require_once "lib/nusoap.php";
$debug = 0;
$server = new soap_server();
$server->configureWSDL('terimaxml', 'urn:terimaxml');
function SayHello($xml){
//messing with xml taking NAME and say Olaa
echo "Olaaa :D";
}
$server->register('SayHello()',
array('xml' =>'xsd:array'),
'urn: terimaxml',
'urn: terimaxml#__construct()',
'rpc',
'encoded',
'-----'
);
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
我已经在互联网上漫游了很长一段时间来解决这个问题。所以任何帮助将不胜感激,在此先感谢。 :d
答案 0 :(得分:0)
此服务的WSDL中未定义“操作”
这是因为
$HTTP_RAW_POST_DATA : '';
该操作&amp; apos 表示您使用禁止xml的撇号值将数据解析为xml。
并尝试使用双引号(“)
更改所有撇号$server->register("SayHello()",
array("xml" =>"xsd:array"),
"urn: terimaxml",
"urn: terimaxml#__construct()",
"rpc",
"encoded",
"-----"
);
如果我错了,请纠正我。
^^
答案 1 :(得分:0)
我不确定这里的代码是否有意清理以便于阅读,但我认为我发现它存在三个问题。
首先,->register
中的函数名称不应包含()
。
$server->register("SayHello",
array("xml" =>"xsd:array"),
"urn: terimaxml",
"urn: terimaxml#__construct()",
"rpc",
"encoded",
"-----"
);
其次,我认为$HTTP_RAW_POST_DATA
错误命名,因此您向函数发送一个空变量。
$HTTP_RAW_POST_DATA = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ?
$GLOBALS["HTTP_RAW_POST_DATA"] : "";
可选第三个,HTTP_RAW_POST_DATA
已弃用,取而代之的是超全局数组$_POST
。
$server->service( http_build_query($_POST) );
我不确定,两个月前我刚刚开始使用nusoap,但这些是我和我的代码之间的差异。一次尝试一个,看看他们是否有帮助。