调试PHP SOAP调用

时间:2010-10-20 00:48:51

标签: php soap

我是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之外的服务交互。

有什么想法?建议?

2 个答案:

答案 0 :(得分:8)

我通常使用方法getFunctionsgetLastRequest 帮助我解决问题。首先,我看一下函数列表和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*/
    }