Also folgte ich diesem Beispiel, um eine benutzerdefinierte API zu erstellen. Ich bin mir jedoch nicht sicher, ob ich es falsch nenne oder mein Code nicht korrekt ist. Hier ist was ich habe.
Ordnerstruktur:
Mycompany
Syncreports
etc
api.xml
wsi.xml
wsdl.xml
Model
Sync
Api
V2.php
Api.php
/app/etc/modules/Mycompany_Syncreports.xml
<?xml version="1.0"?>
<config>
<modules>
<Mycompany_Syncreports>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Api />
</depends>
</Mycompany_Syncreports>
</modules>
</config>
/app/code/local/Mycompany/Syncreports/etc/api.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Mycompany_Syncreports>
<version>1.0.0</version>
</Mycompany_Syncreports>
</modules>
<api>
<resources>
<syncreports_sync translate="title" module="mycompany_syncreports">
<title>Synchronization API</title>
<model>syncreports/sync_api</model>
<acl>syncreports/sync</acl>
<methods>
<info translate="title" module="mycompany_syncreports">
<title>Retrieve synchronization info</title>
<acl>syncreports/sync/info</acl>
<method>info</method>
</info>
</methods>
<faults module="mycompany_syncreports">
<project_not_exists>
<code>101</code>
<message>Requested project does not exist.</message>
</project_not_exists>
<invalid_data>
<code>102</code>
<message>Provided data is invalid.</message>
</invalid_data>
<save_error>
<code>103</code>
<message>Error while saving project. Details in error message.</message>
</save_error>
<remove_error>
<code>104</code>
<message>Error while removing project. Details in error message.</message>
</remove_error>
</faults>
</syncreports_sync>
</resources>
<resources_alias>
<sync>syncreports_sync</sync>
</resources_alias>
<v2>
<resources_function_prefix>
<sync>syncreportsSync</sync>
</resources_function_prefix>
</v2>
<acl>
<resources>
<syncreports translate="title" module="mycompany_syncreports">
<title>SyncReports</title>
<sync translate="title" module="mycompany_syncreports">
<title>Synchronization</title>
<sort_order>110</sort_order>
<info translate="title" module="mycompany_syncreports">
<title>Info</title>
</info>
</sync>
</syncreports>
</resources>
</acl>
</api>
</config>
/app/code/local/Mycompany/Syncreports/etc/wsi.xml
<?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="syncreportsSyncInfoEntity">
<xsd:sequence>
<xsd:element name="entity_id" type="xsd:string" />
<xsd:element name="name" type="xsd:string" />
<xsd:element name="description" type="xsd:string" />
<xsd:element name="status" type="xsd:string" />
<xsd:element name="created_at" type="xsd:string" />
<xsd:element name="updated_at" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="syncreportsSyncInfoRequestParam">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="sessionId" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1" name="projectId" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="syncreportsSyncInfoResponseParam">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="result" type="typens:portfolioProjectInfoEntity" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="syncreportsSyncInfoRequest">
<wsdl:part name="parameters" element="typens:syncreportsSyncInfoRequestParam" />
</wsdl:message>
<wsdl:message name="syncreportsSyncInfoResponse">
<wsdl:part name="parameters" element="typens:syncreportsSyncInfoResponseParam" />
</wsdl:message>
<wsdl:portType name="{{var wsdl.handler}}PortType">
<wsdl:operation name="syncreportsSyncInfo">
<wsdl:documentation>Retrieve project info</wsdl:documentation>
<wsdl:input message="typens:syncreportsSyncInfoRequest" />
<wsdl:output message="typens:syncreportsSyncInfoResponse" />
</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="syncreportsSyncInfo">
<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>
/app/code/local/Mycompany/Syncreports/etc/wsdl.xml
<?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/" />
<complexType name="syncreportsSyncInfoEntity"><!-- define type for retrieve info -->
<all>
<element name="entity_id" type="xsd:string" minOccurs="1" />
<element name="name" type="xsd:string" minOccurs="1" />
<element name="description" type="xsd:string" minOccurs="0" />
<element name="status" type="xsd:string" minOccurs="0" />
<element name="created_at" type="xsd:string" minOccurs="1" />
<element name="updated_at" type="xsd:string" minOccurs="1" />
</all>
</complexType>
</schema>
</types>
<message name="syncreportsSyncInfoRequest">
<part name="sessionId" type="xsd:string" />
<part name="projectId" type="xsd:string" />
</message>
<message name="syncreportsSyncInfoResponse">
<part name="result" type="typens:syncreportsSyncInfoEntity" />
</message>
<portType name="{{var wsdl.handler}}PortType">
<operation name="syncreportsSyncInfo">
<documentation>Retrieve project info</documentation>
<input message="typens:syncreportsSyncInfoRequest" />
<output message="typens:syncreportsSyncInfoResponse" />
</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="syncreportsSyncInfo">
<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>
/app/code/local/Mycompany/Syncreports/Model/Sync/Api.php
<?php
class Mycompany_Syncreports_Model_Sync_Api extends Mage_Api_Model_Resource_Abstract
{
public function info($projectId){
return "This is the message: ".$projectId;
}
}
/app/code/local/Mycompany/Syncreports/Model/Sync/Api/V2.php
<?php
class Mycompany_Syncreports_Model_Sync_Api_V2 extends Mycompany_Syncreports_Model_Sync_Api{
public function info($projectId){
return "This is the message: ".$projectId;
}
}
Und so nenne ich meine API:
<?php
$host = "127.0.0.1/magento/index.php";
$client = new SoapClient("http://".$host. "/api/soap/?wsdl");
$apiuser= "user";
$apikey = "123456";
$action = "syncreports.info";
try {
$session_id= $client->login($apiuser, $apikey);
$result = array();
$result= $client->call($session_id, $action, array("test"));
var_dump($result);
}
catch (Exception $e){
echo var_dump($e);
throw $e;
}
?>
Bei Verwendung dieses Coads wird folgende Fehlermeldung angezeigt: Schwerwiegender Fehler: Nicht erfasste SoapFault-Ausnahme: [3] Ungültiger API-Pfad
Irgendwelche Ideen, wie ich das lösen soll?
/app/code/local/Mycompany/Syncreports/etc/config.xml
<?xml version="1.0" ?>
<config>
<modules>
<Mycompany_Syncreports>
<version>1.0.0</version>
</Mycompany_Syncreports>
</modules>
<global>
<helpers>
<mycompany_syncreports>
<class>Mycompany_Syncreports_Helper</class>
</mycompany_syncreports>
</helpers>
</global>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<foo_bar before="Mage_Adminhtml">Mycompany_Syncreports_Adminhtml</foo_bar>
</modules>
</args>
</adminhtml>
</routers>
</admin>
<frontend>
<routers>
<syncreports>
<use>standard</use>
<args>
<module>Mycompany_Syncreports</module>
<frontName>syncreports</frontName>
</args>
</syncreports>
</routers>
</frontend>
<adminhtml>
<layout>
<updates>
<syncreports>
<file>mycompany/syncreports.xml</file>
</syncreports>
</updates>
</layout>
</adminhtml>
</config>
Mage_Api_Model_Server_Handler_Abstract
. Suchen Sie nach dem Codethrow new Mage_Api_Exception('resource_path_not_callable');
. Sie können von dort aus debuggen. Es gibt 4 solcher Vorkommen. Höchstwahrscheinlich sind Ihre Modelle nicht richtig konfiguriert. Fügen Sie dasconfig.xml
Ihres Moduls zur Frage hinzu. Das kann die Dinge klärenIch habe auch das gleiche Problem (ungültiger API-Pfad). Bitte jemand weiß, lass mich antworten .. Hier ist mein Code Was ich getan habe?
api.xml
config.xml
1.1.65
quelle
Der Ressourcenname sollte nicht mit dem in der folgenden Datei api.xml übereinstimmen
<rescustomapi>
ist mein Ressourcenname, während customapi mein Modulname ist. Vielleicht haben Sie beide Namen gleich.quelle