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'] );