Magento API : 비누 V2에 새 메소드 게시


Answers

코드가 훌륭합니다! 에 실수가 없다.

내가 아는 한 (내 경험으로). 이 예외는 api.xml의 태그 배치가 function이라는 사용자와 일치하지 않기 때문에 나타납니다.

파일 확인

core \ Mage \ Catalog \ Model \ Product \ Api.php

core \ Mage \ Catalog \ Model \ Product \ Api \ V2.php

두 클래스 모두에 items 라는 함수가 있습니다 .

api_v2 클래스의 코드를 다음과 같이 api_v1에 추가해야합니다.

<?php
class Mycompany_Mymodule_Model_Api_V2 extends Mycompany_Mymodule_Model_Api
{        
    public function myapimethod($sessionId, $message)
    {
        return "This is the message : ".$message;
    }
}

또는

캐시 일 수 있습니다.

API V2이기 때문에 캐시가 강력합니다. 다음에서 캐시를 비우십시오.

  1. 관리자 -> 시스템 -> 캐시 관리 -> 마젠타 캐시 지우기.
  2. /tmp/wsdl.xml (서버에 숨김)에서 wsdl.xml 캐시를 지우고 grep 하려고하십시오.
  3. var / log / *에있는 모든 파일을 제거하십시오.
Question

나는 Magento에서 새롭고 내 자신의 API v2 메소드를 만들고 싶습니다. 간단한 프로젝트를 만들었습니다 ...

Mycompany
    Mymodule
        etc
            api.xml
            config.xml
            wsdl.xml
        Model
            Api
                V2.php
            Api.php


이것들은 주 파일들입니다 ...
(1) api.xml

<config>
    <api>
        <resources>
            <mymodule translate="title" module="mymodule">
                <title>mymodule</title>
                <model>mymodule/api</model>
                <methods>                    
                    <myapimethod translate="title" module="mymodule">
                        <title>myapimethod</title>
                        <acl>mymodule/myapimethod</acl>
                    </myapimethod>
                </methods>
            </mymodule>
        </resources>
        <v2>
            <resources_function_prefix>
                <mymodule>mymodule</mymodule>
            </resources_function_prefix>
        </v2>
        <acl>
            <resources>
                <mymodule translate="title" module="mymodule">
                    <title>Mymodule</title>
                    <sort_order>2000</sort_order>                    
                    <myapimethod translate="title" module="mymodule">
                        <title>myapimethod</title>
                    </myapimethod>  
                </mymodule>
            </resources>
        </acl>
    </api>
</config>

(2) 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/" />
        </schema>
    </types>
    <message name="myapimethodRequest">
        <part name="sessionId" type="xsd:string"/>
        <part name="message" type="xsd:string" />
    </message>
    <message name="myapimethodResponse">
        <part name="result" type="xsd:string" />
    </message>
    <portType name="{{var wsdl.handler}}PortType">
        <operation name="myapimethod">
            <documentation>this is an example of api method...</documentation>
            <input message="typens:myapimethodRequest" />
            <output message="typens:myapimethodResponse" />
        </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="myapimethod">
            <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>

(3) Api.php

<?php
class Mycompany_Mymodule_Model_Api extends Mage_Api_Model_Resource_Abstract
{        
        public function myapimethod($sessionId, $message)
        {
            return "This is the message : ".$message;
        }
}

(4) V2.php

<?php
class Mycompany_Mymodule_Model_Api_V2 extends Mycompany_Mymodule_Model_Api
{        

}

(5) test.php

<?php
try {
    define("SOAP_WSDL",'http://localhost:8080/magento/index.php/api/?wsdl');
    define("SOAP_WSDL2",'http://localhost:8080/magento/index.php/api/v2_soap?wsdl=1');
    define("SOAP_USER","dtsSoapUser");
    define("SOAP_PASS","casares");

    if($_GET['ver'] == '2') {
        $client = new SoapClient(SOAP_WSDL2, array('trace' => 1,'cache_wsdl' => 0));
        echo "<br>version 2 <br>";
    }
    else {
        $client = new SoapClient(SOAP_WSDL,array('trace' => 1,'cache_wsdl' => 0));

        echo "<br>version 1 <br>";
    }
    $session = $client->login(SOAP_USER, SOAP_PASS);
    $result = array();

    try {
        if($_GET['ver'] == '2') {
             $result = $client->Myapimethod($session, "My message....");
             var_dump ( $result);        
        } else {            
            $result= $client->call($session, 'mymodule.myapimethod', array($session, "My message ...."));
            var_dump($result);
        }
    } catch (SoapFault $exception) {
        echo 'EXCEPTION='.$exception;
    }

    echo "<br>end test<br>";
} catch (Exception $e){
    echo var_dump($e);
    throw $e;
}   
?>

다음 URL을 사용하면 결과는 다음과 같습니다.

... / test.php /? ver = 1

version 1
string 'This is the message : My message ....' (length=37)
end test

그것은 말할 수 있습니다 : 비누 v1을 사용하여, 방법은 작동합니다!.

하지만 비누 v2 호출을 사용하면 ...

... / test.php /? ver = 2 결과는 다음과 같습니다.

version 2
EXCEPTION=SoapFault exception: [3] Invalid api path. in C:\wamp\www\PruebasPHP\test.php:22 Stack trace: #0 C:\wamp\www\PruebasPHP\test.php(22): SoapClient->__call('Myapimethod', Array) #1 C:\wamp\www\PruebasPHP\test.php(22): SoapClient->Myapimethod('b9e1e8d15a61398...', 'My message....') #2 {main}
end test


역할은 모든 API 리소스에 액세스 할 수 있습니다 ...

나는 무엇이 잘못되었는지를 모른다. 아무도이 문제를 도와 드릴까요? acl과 관련된 어떤 것도있을 수 있습니까? 미리 감사드립니다 !!!




Links