我在根据我的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中获取它?
答案 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类型提示。它可以防止整个类的错误,并且值得轻微的性能损失。