PHP中nuSOAP绑定操作input/output缺失name参数的解决方案咨询
解决nuSOAP中为binding的input/output添加name属性的问题
我之前也碰到过一模一样的需求,nuSOAP默认生成的WSDL里,binding节点下的<input>和<output>标签确实不会自动带上name属性,不过我们可以通过操作nuSOAP的WSDL对象来实现这个需求,下面是具体的实现步骤:
1. (可选)定义请求/响应对应的复杂类型
如果你的接口需要自定义请求和响应的数据结构,先通过addComplexType方法创建对应的complexType,这样name属性就能和WSDL里的类型正确关联:
// 初始化nuSOAP服务器实例 $server = new nusoap_server(); $server->configureWSDL('service', 'urn:service'); $server->wsdl->schemaTargetNamespace = 'urn:service'; // 定义ImportOrdersRequestType请求类型 $server->wsdl->addComplexType( 'ImportOrdersRequestType', 'complexType', 'struct', 'all', '', array( 'orderNumber' => array('name' => 'orderNumber', 'type' => 'xsd:string'), 'orderAmount' => array('name' => 'orderAmount', 'type' => 'xsd:decimal') ) ); // 定义ImportOrdersResponseType响应类型 $server->wsdl->addComplexType( 'ImportOrdersResponseType', 'complexType', 'struct', 'all', '', array( 'resultCode' => array('name' => 'resultCode', 'type' => 'xsd:int'), 'resultMsg' => array('name' => 'resultMsg', 'type' => 'xsd:string') ) );
2. 注册服务并手动添加input/output的name属性
注册你的业务方法之后,直接操作nuSOAP的WSDL对象,找到对应的operation节点,给它的input和output子节点添加name属性:
// 注册ImportOrders业务方法 $server->register( 'ImportOrders', array('request' => 'tns:ImportOrdersRequestType'), array('return' => 'tns:ImportOrdersResponseType'), 'urn:service', 'urn:service#ImportOrders', 'document', 'literal', '处理订单导入请求' ); // 获取对应的operation对象 $operation = $server->wsdl->getOperation('ImportOrders'); // 给input节点添加name属性 if ($operation->input) { $operation->input->setAttribute('name', 'ImportOrdersRequestType'); } // 给output节点添加name属性 if ($operation->output) { $operation->output->setAttribute('name', 'ImportOrdersResponseType'); }
3. 验证最终生成的WSDL
启动服务后,访问你的WSDL地址(比如http://你的域名/服务文件.php?wsdl),就能看到binding节点下的input和output已经带上了目标name属性,和你想要的格式完全一致:
<binding name="serviceBinding" type="tns:servicePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="ImportOrders"> <soap:operation soapAction="urn:service#ImportOrders" style="document"/> <input name="ImportOrdersRequestType"> <soap:body use="literal" namespace="urn:service"/> </input> <output name="ImportOrdersResponseType"> <soap:body use="literal" namespace="urn:service"/> </output> </operation> </binding>
额外提示
- 如果不需要自定义数据结构,只是单纯想添加name属性,可以跳过第一步,直接在注册服务后操作operation对象添加属性。
- 尽量使用较新版本的nuSOAP,旧版本可能在
getOperation或setAttribute方法上存在兼容性问题。
内容的提问来源于stack exchange,提问作者Mindaugas Jakubauskas
相关产品推荐
相关产品推荐

