调试PHP SOAP调用
我是SOAP的新手,并且处理一个Web服务,它似乎之前没有人使用过PHP接口。除C#外,他们没有任何示例代码,但我的确拥有这些代码。 eServices.asmx提供了WSDL,如果这是正确的说法。调试PHP SOAP调用
我得到的错误是“服务器无法识别HTTP Header 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之外的服务交互。
有什么想法?建议吗?
我通常使用方法getFunctions 和getLastRequest 来帮助我解决问题。首先我看看函数列表和WSDL。有时WSDL和/或服务器没有正确设置/配置/编码。所以这个函数列表可能没用。 WSDL文件应该是权威的,但是,唉,蹩脚的编码器等...
所以有时我必须在黑暗中刺,看看错误,然后看最后的请求。有了这个,你可以看到生成的实际XML。将它与一些可用的XML示例进行比较。
在处理不想编写文档的编码人员时,这已证明最有用。顺便说一下,他们应该给出XML示例 - 不会显示如何使用语言XYZ生成XML。可能有更多有用的相关信息在the PHP/Soap documentation
HTH
你可以使用Fiddler网络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*/
}
感谢您的答复模拟人生!当我打电话给 $ funcs = $ soapclient - > __ getFunctions(); print_r($ funcs); 我得到同样的错误? SOAP_Fault对象 ( [error_message_prefix] => [模式] => 1 [级] => 1024 [代码] =>皂:客户端 [消息] =>服务器不承认的值HTTP头部SOAPAction:。 [userinfo] => – jerrygarciuh 2010-10-20 15:14:17
好的,那么问题就会更深入,更可能是一个配置问题......搜索提出了一些关于XML名称空间的问题:http://bluebones.net/2003/ 07/server-did-not-recognized-http-header-soapaction/ – 2010-10-21 02:35:59
顺便说一句,你使用的是WSDL文件/ URL吗? – 2010-10-21 02:39:25