2017-01-11 71 views
6

Symfony uygulamasında bir Soap sunucusu yapıyorum. İlk adım olarak benim "merhaba dünya" Sabun eylem ile bir denetleyici yarattı ve bunun için rotayı tanımlanmış: ŞimdiSihirli WSDL URI sorgu parametresiyle nasıl çalışır?

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; 
} 

zaman http://my-app.loc/soapapi/foo/bar'u bir tarayıcıda veya cURL kullanarak (HTTP GET ile) arayarak bir hata mesajı alıyorum:

<?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'u aradığımda, aslında (üretilen) WSDL belgesini aldım. Niye ya? Hiçbir yerde tanımlamamıştım, bunun böyle çalışması gerekiyor. Neden ve nasıl (sihir) çalışır? Symfony'ye özgü sihir mi?

cevap

2

Bu harika bir soru.

Bu Symfony özgü değil, PHP'de yerleşik SOAP sunucusunun davranışı. Ben edemedik ettik

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

bulmak için bu davranış üzerine belgelenmiştir: son nokta URL eklenmiş ?wsdl ile erişildiğinde, SABUN sunucusu yapıcısı içinde Örneklenen wsdl belgesiyle yanıt verecektir PHP web sitesi, ancak açıkça var ve tekrarlanabilir.

Özelliğin kodu PHP's source code starting on line 1550 adresinde bulunabilir ve 1592 numaralı hat üzerinde biter. Kod, istek yönteminin GET olup olmadığını kontrol eder ve 'wsdl' sorgu parametresinin varlığını kontrol eder.

+1

Bu davranış, [php-src] (https://github.com/php/php-src) adlı kullanıcının [soap uzantısı] [https://github.com/php/php-src/] adresinde bulunabilir. leke/ana/Ext/sabun/soap.C# L1550). Cevabınız doğru. – Joe

+0

Teşekkürler @Joe Cevabı güncelledim. –