如何赶上从一个PHP SoapServer的SOAP请求的XML内容的数据?(How do I ca

2019-10-17 07:02发布

我想建立一个SOAP服务在PHP。 我宣布一个服务器PHP函数,我可以调用该函数与SOAP键入http请求,其中所述内容是我的SOAP信封。

SOAP体的XML内容是我承担函数的自变量,但我不知道如何访问它在我的PHP代码的信息。

我注意到,函数的参数是一个实例stdClass默认情况下,我居然不知道它为什么不上铸造XMLDOM通过PHP对象-这是一个SOAP调用是不是? 不过没事,现在是由我来得到信息的对象,因为没有分配方法,这是不容易的stdClass ,所以它必须是标准的PHP函数。 所以,我想serialize ,但是这给了我一些垃圾,而不是XML字符串我的预期。

该怎么办?

编辑

注意,下面有什么,我希望做任何示例代码-从SOAP请求的XML内容得到一些详细的数据-因为我不知道如何代码从stdClass的对象得到它

大卫的要求,这里的一些细节。

PHP代码:

<?php
    function mi102($arg) {
        $txt = serialize ($arg);
        $result = new SoapVar ($txt, XSD_ANYXML);
        return($result);
    }
    ini_set( "soap.wsdl_cache_enabled", "0");
    $server = new SoapServer ("test.wsdl");
    $server -> addFunction ("mi102");
    try {
        $server -> handle();
    }
    catch (Exception $e) {
        $server -> fault ('Client', $e -> getMessage());
    }
?php>

http请求是由我使用的应用程序构成; HTTP报头和SOAP信封+体围绕所述XML我给它产生:

SOAP请求主体内容:

<mi102 xmlns="http://pse">
  <cdhead cisprik="21"/>
  <instr>
    <insid>
      <bcdt>20120930</bcdt>
    </insid>
  </instr>
</mi102>

使用的WSDL如下:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://pse/" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="PSE" targetNamespace="http://pse/">
    <types>
        <xs:schema>
            <xs:import namespace="http://pse/" schemaLocation="PSE.xsd"/>
        </xs:schema>
    </types>
    <message name="MI102Req">
        <part name="cdhead" type="tns:cdhead_T"/>
        <part name="instr" type="tns:instr_T"/>
    </message>
    <message name="Res">
        <part name="cdhead" type="tns:cdhead_T"/>
    </message>
    <portType name="MIPortType">
        <operation name="mi102">
            <input message="tns:MI102Req"/>
            <output message="tns:Res"/>
        </operation>
    </portType>
    <binding name="MIBinding" type="tns:MIPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="mi102">
            <soap:operation soapAction="http://testServerURL/test_soap.php#mi102"/>
            <input>
                <soap:body use="literal" namespace="http://pse/"/>
            </input>
            <output>
                <soap:body use="literal" namespace="http://pse/"/>
            </output>
        </operation>
    </binding>
    <service name="PSE">
        <port name="MIPortType" binding="tns:MIBinding">
            <soap:address location="http://testServerURL/test_soap.php"/>
        </port>
    </service>
</definitions>

将得到的XML(再次,通过我使用该应用程序从SOAP主体中提取),是

SOAP响应:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:mi102Response xmlns:ns1="http://pse/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">O:8:"stdClass":2:{s:7:"cisprik";i:21;s:7:"version";s:2:"13";}</ns1:mi102Response>

不是很好。

Answer 1:

我终于找到了答案,在其他线程上所以,像GET-收到的XML-从-PHP皂服务器

解决的办法是使用以下命令:

$inp = file_get_contents ('php://input');

注:我找不到可以作用于任何功能stdClass输入参数,并可以从中检索XML SOAP正文内容。
所以最好的办法是使用标准的PHP输入变量。 请注意,这有以下结构: Envelope/Body/..inputXML.. ,这是发送到服务器的确切http请求的内容。

注: http_get_request_body可能工作过,但我的PHP服务器不支持此功能。 我认为file_get_contents支持一些版本起每一个PHP的服务器上。



Answer 2:

这会不会开始作为一个完整的答案,但我想要的格式。 请你设置什么了阐述。 一般情况下,你将有要公开为Web服务提供的常规参数(不是XML)PHP的方法。 如何做到这一个基本的例子是在这里:

http://www.phpeveryday.com/articles/Web-Services-WSDL-Creating-SOAP-Server-P484.html

SOAP体的XML内容是我承担函数的自变量

不,SOAP体的XML内容与你的论点的方法的代表性 ,但你的论点是任何你想要的。 你不应该有应对手动XML,如果你使用PHP的SoapServer时和SoapClient的设置。

编辑:你把你的说法,这是你的SOAP请求的身体的一个简单的PHP数组表示,其序列并把它发回的响应(这是你观察到了什么)。 这是你想要做什么? 难道你不想做的请求数据的东西吗? 此外,还可以发布这类从WSDL导入的模式?



Answer 3:

你有一个对象,因为你正在返回序列化的对象是“不好听”表示(序列化对象及其状态转换为字符串表示)。 如果你想拥有返回对象的XML表示您应该将函数的返回参数类型更改为一个对象。 因为现在返回一个字符串。

我会建议你使用Zend框架的Zend_Soap_Server和Zend_Soap_Autodiscover组件。

随着Zend_Soap_Autodiscover你可以写你的函数文档块生成Web服务定义(WSDL)动态。 而Zend_Soap_Server是很酷。

如果使用这些组件并记录你的类型,你的功能,而无需序列化它返回一个特定的类型,那么你会根据WSDL定义接收XML表示形式。 还每次创建类型自动通过Zend_Soap_Autodiscover转换为在生成的WSDL的complexType。

样品:

 public class Person{
         public $id;
         public $name;
    }

    public class MyService {
     /**
     *
     * @param integer $UserID
     * @return Person
     */
    function mi102($UserID) {

         $output = new Person();
         $output->id = 2;
         $output->name = 'Peter';        

        return $output;
    }
}


// Generate WSDL relevant to code
if (isset($_GET['wsdl'])){

    $autodiscover = new Zend_Soap_AutoDiscover();
    $autodiscover->setClass('MyService');
    $autodiscover->handle();

} else {

    $server = new Zend_Soap_Server($serviceURL . "?wsdl");
    $server->setClass('MyService');
    $server->setObject(new MyService());
    $server->handle();

}


文章来源: How do I catch data from the XML content of a SOAP request in a php SOAPServer?