zend_soap_server utf-8编码不起作用

时间:2013-08-31 13:42:01

标签: php web-services zend-framework wsdl zend-soap

我正在使用zend_soap_server开发一个soap webservice。 我使用Zend_Soap_AutoDiscover自动生成我的webservice的wsdl。

这是代码

public function indexAction() { // my websrvice method

      $server = new Zend_Soap_Server("admin/webservice/wsdl");

      $server->setEncoding('UTF-8');

      $server->setClass('Webservice');

      $server->handle();
}

public function wsdlAction() { // my wsdl method

      $wsdl = new Zend_Soap_AutoDiscover();

      $wsdl->setClass('Webservice');

      $wsdl->setUri("/admin/webservice");

      $wsdl->handle();
}

我的问题是,当我查看生成的wsdl的来源时,第一行是:

<?xml version="1.0"?>

但我想要xml标签中的编码:

<?xml version="1.0" encoding="UTF-8"?>

我该怎么做才能得到这个?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

我检查了Zend Framework代码,看起来WSDL的第一行是硬编码的:

    $wsdl = "<?xml version='1.0' ?>
            <definitions name='$name' targetNamespace='$uri'
                xmlns='http://schemas.xmlsoap.org/wsdl/'
                xmlns:tns='$uri'
                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/'></definitions>";

上面的代码片段来自Zend/Soap/Wsdl.php的第91行。因此,对您的问题的简单修复是修改上面代码的第一行以包含编码:

    $wsdl = "<?xml version='1.0' encoding='UTF-8' ?>

我刚刚运行此代码,它实现了预期的结果。我不会太担心必须修改框架代码。我有一套标准的补丁,自从大约1.7以来我一直在ZF1的顶部运行,修复了一些我不同意的奇怪之处。这就是开源的美妙之处 - 您无需向公司支付数千美元即可进行单行更改!如果您升级到ZF1的下一个维护版本(假设有一个版本出现),请确保您记得重新运行补丁。