题
所以我跟随 这个 创建自定义API的示例。但是我不确定我是错误的还是我的代码不正确。这是我的。
文件夹结构:
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;
}
}
这就是我打电话给我的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;
}
?>
使用此coad我会遇到错误:致命错误:未浸泡的肥皂伪造例外:[3]无效的API路径
有什么想法我应该解决这个问题吗?
/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>
解决方案
您的动作名称应该是
$action = 'syncreports_sync.info';
通常,这里是API V1方法名称的外观。
entity_alias.method
| |
| |------------the name of the method to call.Child of the `<methods>` tag in the `api.xml` file
|
|--- the tag name you specified in `api.xml` inside the `<resources>` tag
编辑
您的另一个问题是由于您缺少模型声明而引起的 config.xml
.
将其添加到 <global>
标签
<models>
<syncreports>
<class>Mycompany_Syncreports_Model</class>
</syncreports>
</models>
如果您想使用 mycompany_syncreports
作为模型别名,就像您为助手所做的那样,将此XML放在上面
<models>
<mycompany_syncreports>
<class>Mycompany_Syncreports_Model</class>
</mycompany_syncreports>
</models>
但是在这种情况下,您需要修改您的 api.xml
.
更改此行:
<model>syncreports/sync_api</model>
对此
<model>mycompany_syncreports/sync_api</model>
其他提示
我也有同样的问题(无效的API路径)。请任何人知道让我回答..这是我的代码?
api.xml
<resources>
<arb translate="title" module="mymodule">
<title>Chiragdodia module</title>
<model>mymodule/api</model>
<methods>
<storesList translate="title" module="mymodule">
<title>Retrieve list of installed stores</title>
<acl>arb/storesList</acl>
</storesList>
</methods>
</arb>
</resources>
<acl>
<resources>
<arb translate="title" module="mymodule">
<title>arb</title>
<create translate="title" module="mymodule">
<title>Create product</title>
</create>
</arb>
</resources>
</acl>
<v2>
<resources_function_prefix>
<arb>arb</arb>
</resources_function_prefix>
</v2>
config.xml
1.1.65
<global>
<helpers>
<mymodule>
<class>Chiragdodia_Mymodule_Helper</class>
</mymodule>
</helpers>
<models>
<catalog>
<rewrite>
<category_api>Chiragdodia_Mymodule_Model_Category_Api</category_api>
<product_api>Chiragdodia_Mymodule_Model_Product_Api</product_api>
<product_attribute_api>Chiragdodia_Mymodule_Model_Product_Attribute_Api</product_attribute_api>
<product_attribute_media_api>Chiragdodia_Mymodule_Model_Product_Attribute_Media_Api</product_attribute_media_api>
<product_link_api>Chiragdodia_Mymodule_Model_Product_Link_Api</product_link_api>
</rewrite>
</catalog>
<core>
<rewrite>
<url>Chiragdodia_Mymodule_Model_Core_Url</url>
<store>Chiragdodia_Mymodule_Model_Core_Store</store>
</rewrite>
</core>
<mymodule>
<class>Chiragdodia_Mymodule_Model</class>
</mymodule>
</models>
</global>