Von V2 SOAP WSDL zurückgegebene falsche Standort-URL

7

Beim Abrufen der V2-WSDL über diese URL:

www.example.com/shop/api/v2_soap?wsdl=1

Es definiert die falsche URL für Anfragen:

<service name="MagentoService">
  <port name="Mage_Api_Model_Server_V2_HandlerPort" binding="typens:Mage_Api_Model_Server_V2_HandlerBinding">
    <soap:address location="http://example.com/shop/index.php/?type=v2_soap"/>
  </port>
</service>

Wie Sie oben sehen können, wird diese URL zurückgegeben:

www.example.com/shop/index.php/?type=v2_soap

Obwohl es sein sollte:

www.example.com/shop/index.php/api/v2_soap/index/

Ich habe einen Großteil des Magento-Kerncodes durchsucht und glaube, dass dieser Wert in /app/code/core/Mage/Api/Model/Wsdl/Config/Base.php in Zeile 53 festgelegt wird:

    // set up default WSDL template variables
    $this->_wsdlVariables = new Varien_Object(
        array(
            'name' => 'Magento',
            'url'  => htmlspecialchars(Mage::getUrl('*/*/*', array('_query' => $queryParams)))
        )
    );

Dieser Teil scheint zu scheitern:

Mage::getUrl('*/*/*' ...

Wenn ich das ändere zu:

Mage::getUrl('api/v2_soap/index' ...

Die richtige URL wird zurückgegeben.

Diese Frage scheint genau das gleiche Problem zu beschreiben, aber es gab nie eine Antwort darauf:

Vielen Dank im Voraus für jede Hilfe!

AKTUALISIEREN

Obwohl ich noch keine dauerhafte Lösung für dieses Problem gefunden habe, habe ich nach einigem Suchen eine vorübergehende Lösung gefunden. Im Wesentlichen erweitere ich die SoapClient-Klasse und überschreibe die __doRequest-Methode, um Anforderungen abzufangen und die Standort-URL zu optimieren, bevor die Anforderung gesendet wird:

class SoapClientLocation extends \SoapClient
{
    public function __doRequest( $req, $location, $action, $version = SOAP_1_1, $one_way = NULL )
    {
        $location = str_replace( '?type=v2_soap', 'api/v2_soap/index/', $location, $one_way );
        return parent::__doRequest( $req, $location, $action, $version );
    }
}

 $this->client = new SoapClientLocation( $this->config['api']['url'] );
Forgueam
quelle
System -> Konfiguration -> Web -> URL-Optionen -> Automatische Umleitung zur Basis-URL.
Stellen
Ich habe das ein paar Mal versucht und es scheint keine Wirkung zu haben.
Forgueam

Antworten:

2

Es können zwei Probleme sein:

  1. Verwenden Sie www.example.com/shop/index.php/api/v2_soap/?wsdlanstelle von www.example.com/shop/api/v2_soap?wsdl=1(beachten Sie die hinzugefügten index.php)
  2. Stellen Sie sicher, dass Sie deaktiviert error_reporting/ display_errorsin Ihrem index.php.

Langer Hinweis zum letzten Punkt: Der SoapClientist kein Browser und sendet daher keine Cookies. Magento wiederum mag Cookies und daher sendet Magento einen Hinweis (wenn error_reporting aktiviert ist), der Hinweis macht Ihr XML ungültig / nicht einmal lass es laden. ( SOAP-ERROR: Parsing WSDL: Couldn't find <definitions>)

Daniel van der Garde
quelle
Ich habe versucht, index.php / zur URL hinzuzufügen, aber es schien nicht zu helfen. Ich werde versuchen, die Fehlerberichterstattung zu untersuchen. Danke für den Tipp!
Forgueam
0

Das Problem ist das

Mage_Api_Controller_Action::preDispatch()

Setzt den aktuellen Speicher auf "admin" (weitere Informationen in Alans Blog-Beitrag http://alanstorm.com/magento_api_adapater_xml_rpc ).

Wenn Sie die Option "Automatische Umleitung zur Basis-URL" festgelegt haben, kann auf die API nicht zugegriffen werden.

Meine Lösung war zuzuhören

controller_front_init_before

Und setzen Sie diesen Konfigurationsknoten auf Null, wenn der URI 'api' enthält. Dh

public function controllerFrontInitBefore($observer) {
    if (stristr(Mage::app()->getRequest()->getRequestUri(), 'api')) {
        Mage::getConfig()->setNode('stores/' . Mage::app()->getStore()->getCode() . '/web/url/redirect_to_base', 0);
    }
}
Wilson Sheldon
quelle