代码之家  ›  专栏  ›  技术社区  ›  jerrygarciuh

调试PHP SOAP调用

  •  5
  • jerrygarciuh  · 技术社区  · 14 年前

    我对SOAP和处理一个Web服务是陌生的,在这个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);
    

    googling认为这个错误是一个名称空间问题。C代码我只有一个名称空间引用:

    [System.Web.Services.WebServiceBindingAttribute(Name="eServicesSoap", Namespace="http://www.example.com/webservices/")]
    

    如果我在函数调用之前将$soapclient转储到屏幕,我会看到它已经从eservices.asmx接收到数据。

    我不确定如何进行调试,而且该服务的工作人员不熟悉在其.NET IDE之外与该服务进行交互。

    有什么想法吗?忠告?

    2 回复  |  直到 6 年前
        1
  •  8
  •   Anthony    6 年前

    我通常用这种方法 getFunctions getLastRequest 帮助我解决问题。首先,我查看函数列表和WSDL。有时WSDL和/或服务器没有正确设置/配置/编码。所以这个函数列表可能是无用的。WSDL文件应该是确定的,但是遗憾的是,蹩脚的编码人员等等……

    所以有时候我不得不在黑暗中摸索一下,看看错误,然后看看最后的请求。通过这个,您可以看到实际生成的XML。将其与一些运行中的XML示例进行比较。

    事实证明,这在处理不想写文档的编码人员时非常有用。顺便说一下,他们应该给出XML示例,而不是演示如何使用XYZ语言生成XML。可能会有更多有用的信息 the PHP/Soap documentation

    高温高压

        2
  •  0
  •   Luca    9 年前

    出于调试目的,您可以使用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*/
        }