我使用Zend Version 1.11创建了以下Web服务
我想将xsd
默认更改为s
的名称空间更改。
如何更改任何命名空间别名?
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
到
xmlns:s="http://www.w3.org/2001/XMLSchema"
如何更改默认讯息部分:
默认情况下会生成getGroupIn
应为getGroupRequest
和
getGroupOut
应为getGroupResponse
是否可以根据W3C更改WSDL顺序?
您的WSDL的结构是
types (1)
portType (1)
binding (1)
service (1)
message (2)
但应该是
types
messages
portTypes
bindings
services
WSDL
if(isset($_GET['wsdl'])) {
$autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex');
$autodiscover->setUri("http://localhost/ZendSoap/services/testwsdl.php");
$autodiscover->setClass('Test');
$autodiscover->handle();
} else {
$soap = new Zend_Soap_Server("http://localhost/ZendSoap/services/testwsdl.php?wsdl"); // this current file here
$soap->setClass('Test');
$soap->handle();
}
class Person
{
/** @var string */
public $name = '';
}
class Group
{
/** @var Person[] */
public $persons;
}
class Test
{
/**
* @return Group
*/
public function getGroup()
{
$group = new Group();
$person = new Person();
$person->name = "Annah";
$group->persons[] = $person;
$person = new Person();
$person->name = "Sarah";
$group->persons[] = $person;
return $group;
}
}
我的WSDL如下所示:
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://localhost/ZendSoap/services/testwsdl.php" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="Test" targetNamespace="http://localhost/ZendSoap/services/testwsdl.php">
<types>
<xsd:schema targetNamespace="http://localhost/ZendSoap/services/testwsdl.php">
<xsd:complexType name="ArrayOfPerson">
<xsd:complexContent>
<xsd:restriction base="soap-enc:Array">
<xsd:attribute ref="soap-enc:arrayType" wsdl:arrayType="tns:Person[]"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Person">
<xsd:all>
<xsd:element name="name" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="Group">
<xsd:all>
<xsd:element name="persons" type="tns:ArrayOfPerson" nillable="true"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</types>
<portType name="TestPort">
<operation name="getGroup">
<documentation>@return Group</documentation>
<input message="tns:getGroupIn"/>
<output message="tns:getGroupOut"/>
</operation>
</portType>
<binding name="TestBinding" type="tns:TestPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getGroup">
<soap:operation soapAction="http://localhost/ZendSoap/services/testwsdl.php#getGroup"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/ZendSoap/services/testwsdl.php"/>
</input>
<output>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/ZendSoap/services/testwsdl.php"/>
</output>
</operation>
</binding>
<service name="TestService">
<port name="TestPort" binding="tns:TestBinding">
<soap:address location="http://localhost/ZendSoap/services/testwsdl.php"/>
</port>
</service>
<message name="getGroupIn"/>
<message name="getGroupOut">
<part name="return" type="tns:Group"/>
</message>
</definitions>
答案 0 :(得分:1)
命名空间在Zend_Soap_Wsdl
类中是硬编码的。我的建议是编写自己的扩展Zend_Soap_Wsdl
的类,并用自己的构造函数替换它。这肯定会解决你问题的第一部分。
至于WSDL生成的其他方面,我认为你需要逐步执行Zend_Soap_Wsdl
,它会进行实际的生成并找出需要更改的位,以便按照你想要的方式生成WSDL它。当您确定需要更改哪一部分代码时,请在子类中重写该方法,然后使用您的子类生成WSDL而不是Zend_Soap_Wsdl
。
要使用您自己的类生成WSDL,您需要将类名作为第三个参数传递给Zend_Soap_AutoDiscover
构造函数。您的类也需要由自动加载器定位。