PHP SOAP中的数据类型

时间:2012-01-11 05:59:43

标签: php python soap

我在根据我的WebService WSDL创建适当的变量时遇到了问题。我已经使用suds 0.4 SOAP库成功地在python中实现了这个简单的功能。

Python实现(tracker是我使用wsdl的SOAP客户端对象):

c = self.tracker.factory.create("ns4:Text")
c.type = "text/html"
c.content = "my content goes here"
self.tracker.service.createComment(c)

如何在PHP中实现它?乍一看,我不太明白如何使用PHP SOAP扩展来实现这一点。 “... factory.create(”ns4:Text“)在python中看起来很方便。我可以检查对象的属性并轻松将其传递给我的可用函数。

我是否真的需要以下列方式在PHP中定义对象:

$c->type = "text/html";
$c->content = "my content goes here";
$this->tracker->__soapCall('createComment',array($c));

此实现期望我知道并将定义对象的所有属性。我有+37属性的复杂数据类型,也是嵌套的。只需要其中的4个,我想将它传递给只填充了4个属性的服务器,但仍然是一个完整的对象,并定义了所有属性......?

这有什么意义吗?

总结:python从wsdl文件创建完整对象,我如何在PHP中获取它?

1 个答案:

答案 0 :(得分:1)

PHP可以使用WSDL文件生成一组适当的方法,您可以将通用对象,数组或标量作为参数传递给它们。您还可以使用SoapClient类的第二个参数指定哪些类映射到哪些方法(classmap选项),以及哪些类型声明映射到哪个序列化回调函数(typemap选项)。 / p>

class doRequestMethod {
    public $id;
    public $attribute;
}

class theResponseClass {
    /* ... */
}

$options = array(
    'classmap' => array(
        'doRequest'   => 'doRequestMethod',
        'theResponse' => 'theResponseClass'
        /* ... */
    ),
    'typemap' => array(
        0 => array(
            'type_ns' => 'http://example.com/schema/wsdl_type.xsd',
            'type_name"'   => 'wsdl_type',
            'from_xml'     => function ($xml_string) { /* ... */ },
            'to_xml'       => function ($soap_object) { /* ... */ }
        )
        /* ... */
    )
)

$client = new SoapClient('/path/to/filename.wsdl', $options);

$request = new doRequestMethod();
$request->id = 0;
$request->attribute = "FooBar";
$result = $client->doRequest($request);

/* 
 * If 'dorequest' returns a 'theResponse' in the WSDL, 
 * then $result should of the type 'theResponseClass'.
 */
assert(get_class($result) === 'theResponseClass');

这是很多工作,所以我建议为自己使用子类化SoapClient。此外,为了使代码更容易调试,请尽可能多地在函数和参数参数上使用PHP类型提示。它可以防止整个类的错误,并且值得轻微的性能损失。