我是SOAP新手并处理一个Web服务,以前似乎没有人使用PHP进行过接口。除了C#之外,他们没有示例代码,但我确实有。 eServices.asmx提供了WSDL,如果这是正确的说法。
我得到的错误是“服务器无法识别HTTP标头SOAPAction的值:”使用该训练冒号表示没有传递任何值,可能。
我的代码如下所示:
$URL = "http://nolaflash.example.com/xxxWS/eServices.asmx";
$namespace="http://www.example.com/webservices/";
include("SOAP/Client.php");
$soapclient = new SOAP_Client($URL);
$xml_data = // valid XML is here;
$res = $soapclient->UpdateData('usrname','pass',$xml_data);
但我也尝试过:
$param = array('usrname','pass',$xml_data);
$res = $soapclient->call('UpdateData',$param, $namespace);
谷歌搜索表明此错误是命名空间问题。我所拥有的C#代码只有一个命名空间引用:
[System.Web.Services.WebServiceBindingAttribute(Name="eServicesSoap", Namespace="http://www.example.com/webservices/")]
如果我在函数调用之前将$ soapclient转储到屏幕上,我发现它已经从eServices.asmx接收了数据。
我不确定如何进行调试,并且该服务的工作人员不熟悉与.NET IDE之外的服务交互。
有什么想法?建议?
答案 0 :(得分:8)
我通常使用方法getFunctions 和getLastRequest 帮助我解决问题。首先,我看一下函数列表和WSDL。有时,WSDL和/或服务器未正确设置/配置/编码。所以这个功能列表可能没用。 WSDL文件应该是确定的,但是唉,蹩脚的编码器等......
所以有时候我必须在黑暗中进行刺,查看错误,然后查看最后一个请求。通过这个,您可以看到生成的实际XML。将其与一些有用的XML示例进行比较。
在与不想编写文档的程序员打交道时,这已被证明是最有帮助的。顺便说一下,他们应该提供XML示例 - 而不是展示如何使用XYZ语言生成XML。 the PHP/Soap documentation
中可能会有更多有用的信息HTH
答案 1 :(得分:0)
出于调试目的,您可以使用Fiddler web debuger。我发现它非常有用。 在这些日子里,我正在开发基于.net Web服务的项目,我必须通过PHP来使用它们。 这是一段有效(并且非常简单)的代码。希望这可以帮到你。 这段代码的目的是检查特定记录的状态。
这是wsdl
POST /b1synccontext.asmx HTTP/1.1
Host: 00.00.00.0
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/QueueEntryGetStatus"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<QueueEntryGetStatus xmlns="http://tempuri.org/">
<BuffID>int</BuffID>
</QueueEntryGetStatus>
</soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<QueueEntryGetStatusResponse xmlns="http://tempuri.org/">
<QueueEntryGetStatusResult>int</QueueEntryGetStatusResult>
</QueueEntryGetStatusResponse>
</soap:Body>
</soap:Envelope>
这是php代码
$client = new SoapClient("http://YOURIP/yourservice.asmx?wsdl",array(
'exceptions'=>true,
'cache_wsdl'=>WSDL_CACHE_NONE,
'encoding'=>'utf-8'));
$params = array(
'BuffID' => 134
);
try
{
$result = $client->QueueEntryGetStatus($params);
$status = $result->QueueEntryGetStatusResult;
/*do something*/
}
catch (Exception $e)
{
$e -> getMessage();
/*do something*/
}