自定义api无效的api路径


8

因此,我按照示例创建了自定义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;
}
?>

使用此外套,我得到以下错误:致命错误:未捕获的SoapFault异常:[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>

Answers:


6

您的动作名称应为

$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>

非常感谢Marius的回答。如您所说,我改变了行动。但是现在我又遇到另一个错误:致命错误:未捕获的SoapFault异常:[4]资源路径不可调用。您有什么想法会导致此错误吗?
intentarr 2014年

@intentarr。抛出异常Mage_Api_Model_Server_Handler_Abstract。寻找代码throw new Mage_Api_Exception('resource_path_not_callable');。您可以从那里进行调试。有4次这样的情况。您的模型很可能配置不正确。将config.xml模块的添加到问题。这可以解决问题
Marius

我添加了config.xml文件,我还将寻找resource_path_not_callable异常。
intentarr 2014年

@intentarr。查看我的答案的更新。太大了,无法添加评论。
马里乌斯

@Marius谢谢,$ action ='syncreports_sync.info'; 这种解释也帮助了我。
Mukesh 2014年

0

我也遇到同样的问题(无效的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>


0

resourcename不应与以下api.xml中的相同

<rescustomapi>是我的资源名称,而customapi是我的模块名称。可能是您的两个名字相同。

<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <rescustomapi translate="title" module="customapi">
                <model>customapi/helloworld_api</model>
                <title>Custom HelloWorld API</title>
                <methods>
                   <setddapi translate="title" module="customapi">
                        <title>Mydons HelloWorld API</title>
                   </setddapi>
                </methods>
                <faults module="customapi">
                    <data_invalid>
                        <code>100</code>
                        <message>Invalid data</message>
                    </data_invalid>
                </faults>
            </rescustomapi>
          </resources>
      </api>
</config>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.