<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>WSDL</faultcode>
<faultstring>
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://testws.localhost/album/wsdl' : failed to load external entity "http://testws.localhost/album/wsdl"
</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Zend Framework 2.2.1 を使用して、PHP で簡単なテスト Web サービスを作成しようとしています。XAMPP v1.8.2-0 を使用しています。インストールされているphpのバージョンは5.4.16です。http://framework.zend.com/manual/2.0/en/user-guide/skeleton-application.htmlにあるスケルトン アプリケーションのチュートリアルに従って、コントローラーが機能するようになりました。
wsdl パスは testws.localhost/album/wsdl または testws.localhost/album?wsdl です。サービスは testws.localhost/album にあります。testws.localhost の代わりに 127.0.0.1 を使用しても違いはありません。
WSDL の URL にアクセスすると、有効な WSDL ファイルのように見えるものが返され、XMLSpy がそれをロード/検証します。ブラウザーでサービスにアクセスすると、上記のエラー応答が返されますが、WSDL を読み込めない理由の詳細は示されません。
生成された WSDL 出力をファイルに保存し、そのパスを使用して、soap リクエスト メソッド内で php でテキストとして生成すると、すべて同じエラーが発生します。'X' からロードできませんでした: 外部エンティティ 'X' をロードできませんでした。WSDL ファイルは、アプリケーション ディレクトリ内の場所から読み取って、エコー アウトできます。
私はこれを解決するために数日を費やし、ここやウェブで同様の質問をたくさん見ましたが、それらはすべて魔法のように解決するか、受け入れられた答えがなく、何も提案されませんでした. コードは以下に含まれています。他の情報が必要な場合はお知らせください。私は zend フレームワーク / php / xampp に比較的慣れていないため、これで完全に停止しました。
AlbumController.php
<?php
namespace Album\Controller;
require_once 'Soaptest.php';
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Soap\Server;
use Zend\Soap\AutoDiscover;
class AlbumController extends AbstractActionController
{
private $_WSDL_URI = "http://testws.localhost/album/wsdl";
private $_URI = "http://testws.localhost/album";
public function indexAction()
{
if(isset($_GET['wsdl']))
{
$this->handleWSDL();
}
else
{
$this->handleSOAP();
}
return $this->getResponse();
}
public function wsdlAction()
{
$this->handleWSDL();
return $this->getResponse();
}
private function handleWSDL() {
$autodiscover = new AutoDiscover();
$autodiscover->setUri('Soaptest');
$autodiscover->setClass($this->_URI);
$autodiscover->handle();
}
private function handleSOAP() {
try
{
$server = new Server($this->_WSDL_URI);
$server->setClass('Soaptest');
$server->handle();
}
catch (Exception $E)
{
$E->faultstring->dump("error.wsdl");
}
}
}
Soaptest.php
<?php
class Soaptest {
/**
* This method returns a string
*
* @param String $value
* @return String
*/
public function hello($value) {
return "hi";
}
}
httpd-vhosts.conf で
<VirtualHost testws.localhost:80>
DocumentRoot "C:/xampp/htdocs/ws/ZendApp/public"
ServerName testws.localhost
ServerAlias www.testws.localhost
SetEnv APPLICATION_ENV "development"
<Directory "C:/xampp/htdocs/ws/ZendApp/public">
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
ホストファイル
127.0.0.1 testws.localhost localhost
wsdl xml
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://testws.localhost/album" 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:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="Soaptest" targetNamespace="http://testws.localhost/album">
<types>
<xsd:schema targetNamespace="http://testws.localhost/album"/>
</types>
<portType name="SoaptestPort">
<operation name="hello">
<documentation>This method returns a string</documentation>
<input message="tns:helloIn"/>
<output message="tns:helloOut"/>
</operation>
</portType>
<binding name="SoaptestBinding" type="tns:SoaptestPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="hello">
<soap:operation soapAction="http://testws.localhost/album#hello"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://testws.localhost/album"/>
</input>
<output>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://testws.localhost/album"/>
</output>
</operation>
</binding>
<service name="SoaptestService">
<port name="SoaptestPort" binding="tns:SoaptestBinding">
<soap:address location="http://testws.localhost/album"/>
</port>
</service>
<message name="helloIn">
<part name="value" type="xsd:string"/>
</message>
<message name="helloOut">
<part name="return" type="xsd:string"/>
</message>
</definitions>