2017-01-11 4 views
6

私はSymfonyアプリケーション内にSoapサーバーを構築しています。最初のステップとして、私は私の "Hello World" SOAPアクションとコントローラを作成し、そのためのルートに定義:今マジックWSDL URIクエリパラメータはどのように機能しますか?

routing.yml

api.soap.foo 
    path: /soapapi/foo 
    defaults: { _controller: SoapBundle\Controller\FooController:bar } 
    methods: [GET, HEAD, POST] 

FooController#bar(...)

protected function bar(Request $request) 
{ 
    $autodiscover = new AutoDiscover(); 
    $autodiscover 
     ->setClass(MyFooBarService::class) 
     ->setUri('http://my-app.loc/soapapi/foo/bar') 
     ->setServiceName('MyFooBarService') 
    ; 
    $wsdl = $autodiscover->generate(); 
    $wsdl->dump(__DIR__ . '/soapapi-foo-bar.wsdl'); 
    $server = new SoapServer(__DIR__ . '/soapapi-foo-bar.wsdl'); 
    $server->setObject($this->myFooBarService); 
    $response = new Response(); 
    $response->headers->set('Content-Type', 'text/xml; charset=ISO-8859-1'); 
    ob_start(); 
    $server->handle(); 
    $response->setContent(ob_get_clean()); 
    return $response; 
} 

を、ときに私ブラウザでhttp://my-app.loc/soapapi/foo/barと電話するか、またはcURLを使用して(HTTP GET経由で)、エラーが表示されます。

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <SOAP-ENV:Fault> 
      <faultcode>SOAP-ENV:Client</faultcode> 
      <faultstring>Bad Request</faultstring> 
     </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

私はhttp://my-app.loc/soapapi/foo/bar?wsdlを呼び出すと、実際に(生成された)WSDLドキュメントを取得します。どうして?私はどこにも定義していないので、このように動作するはずです。なぜ、どのようにこれは(魔法)働くのですか? Symfony固有の魔法ですか?

答えて

2

これは大きな質問です。

これはSymfony固有のものではありません。これはPHPのビルトインSOAPサーバーの動作です。エンドポイントURLが追加?wsdlでアクセスした場合、SOAPサーバーは、それがコンストラクタででインスタンス化されたWSDL文書で応答します:

$server = new SoapServer(__DIR__ . '/soapapi-foo-bar.wsdl'); 

私はこの動作が上で文書化されている場所を見つけることができていませんでしたPHPのウェブサイトですが、明らかに存在し、再現性があります。

この機能のコードはPHP's source code starting on line 1550で終わり、1592で終わります。コードは要求メソッドがGETであるかどうかをチェックし、 'wsdl'クエリパラメータの有無をチェックします。

+1

この現象は、[php-src](https://github.com/php/php-src)の[soap extension](https://github.com/php/php-src/)で確認できます。 blob/master/ext/soap/soap.c#L1550)。あなたの答えは正しいです。 – Joe

+0

ありがとう@ジョー私は答えを更新しました。 –

関連する問題