I'm being driven mad by this wsi.xml file which doesn't seem to be doing what I'm asking of it. I'm creating my own API which does a bunch of things using a product's EAN (a custom attribute).
It works perfectly with a V1 API call, but isn't working for version 2 with or without WS-I compliance on.
My folder structure looks like this:
Namespace
Eanapi
etc
api.xml
config.xml
wsdl.xml
wsi.xml
Model
Api
V2.php
Api.php
Pretty straight forward.
The api.xml file looks like this:
<?xml version="1.0"?>
<config>
<api>
<resources>
<eanapi translate="title" module="eanapi">
<model>eanapi/api</model>
<methods>
<specialprice translate="title" module="eanapi">
<title>Update Special Price by EAN</title>
</specialprice>
</methods>
<faults>
<data_invalid>
<code>100</code>
<message>Invaid Data</message>
</data_invalid>
</faults>
</eanapi>
</resources>
<v2>
<resources_function_prefix>
<eanapi>eanapi</eanapi>
</resources_function_prefix>
</v2>
<resources_alias>
<eanapi>eanapi</eanapi>
</resources_alias>
</api>
</config>
My wsdl.xml file looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:typens="urn:{{var wsdl.name}}" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"
name="{{var wsdl.name}}" targetNamespace="urn:{{var wsdl.name}}">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
</schema>
</types>
<message name="eanapiApiSpecialpriceRequest">
<part name="sessionId" type="xsd:string"/>
<part name="message" type="xsd:string" />
</message>
<message name="eanapiApiSpecialpriceResponse">
<part name="result" type="xsd:string" />
</message>
<portType name="{{var wsdl.handler}}PortType">
<operation name="eanapiApiSpecialprice">
<documentation>Load product by EAN</documentation>
<input message="typens:eanapiApiSpecialpriceRequest" />
<output message="typens:eanapiApiSpecialpriceResponse" />
</operation>
</portType>
<binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="eanapiApiSpecialprice">
<soap:operation soapAction="urn:{{var wsdl.handler}}Action" />
<input>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="{{var wsdl.name}}Service">
<port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding">
<soap:address location="{{var wsdl.url}}" />
</port>
</service>
</definitions>
And finally the wsi.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:typens="urn:{{var wsdl.name}}"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
name="{{var wsdl.name}}"
targetNamespace="urn:{{var wsdl.name}}">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:{{var wsdl.name}}">
<xsd:complexType name="eanapiApiSpecialpriceEntity">
<xsd:all>
<xsd:element name="ean" type="xsd:string" minOccurs="1" />
</xsd:all>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="eanapiApiSpecialpriceRequest">
<wsdl:part name="parameters" element="typens:eanapiApiSpecialpriceRequestParam" />
</wsdl:message>
<wsdl:message name="eanapiApiSpecialpriceResponse">
<wsdl:part name="parameters" element="typens:eanapiApiSpecialpriceResponseParam" />
</wsdl:message>
<wsdl:portType name="{{var wsdl.handler}}PortType">
<wsdl:operation name="eanapiApiSpecialprice">
<wsdl:documentation>Get product by Ean</wsdl:documentation>
<wsdl:input message="typens:eanapiApiSpecialpriceRequest" />
<wsdl:output message="typens:eanapiApiSpecialpriceResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="eanapiApiSpecialprice">
<soap:operation soapAction="" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="{{var wsdl.name}}Service">
<wsdl:port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding">
<soap:address location="{{var wsdl.url}}" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Edit:
With WSI off I get an error saying: PHP Fatal error: Uncaught SoapFault exception: [3] Invalid api path.
I'm running the query with the following code:
$client = new SoapClient('http://magento.dev/api/v2_soap/?wsdl');
$session_id = $client->login($user, $key);
$result = $client->eanapiApiSpecialprice(
$session_id, 'test');
var_dump ($result);
With WSI compliance on I get an error saying: PHP Fatal error: Uncaught SoapFault exception: [Receiver] Unknown error in test.php:25
$client = new SoapClient('http://magento.dev/api/v2_soap/?wsdl');
$session = $client->login(array('username' => $user, 'apiKey' => $key));
$sesion_id = $session->result;
$result = $client->eanapiApiSpecialprice(
(object)array('sessionId' => $sesion_id,
'ean' => 'test')
);
var_dump ($result);
xsd:schema
. – mam08ixo Mar 6 '15 at 11:16xsd:schema
(complexType
,all
,element
) are missing thexsd:
namespace prefix. As you did not explain what the error actually is (apart from not doing what I'm asking) I can only give that hint and not post an answer, sorry. – mam08ixo Mar 6 '15 at 11:38Invalid api path
– hammygoonan Mar 6 '15 at 12:00