Magento2 REST API-Fehler 'Klasse existiert nicht'

12

Ich habe einen Test-Magento 2.0.2-REST-Webdienst basierend auf Alans Blog erstellt: http://alankent.me/2015/07/24/creating-a-new-rest-web-service-in-magento-2/

Ich verwende Postman, um den benutzerdefinierten Webdienst aufzurufen und die folgende Fehlermeldung zu erhalten:

"message": "Class  does not exist",
  "code": -1,
  "trace": "#0 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\Webapi\\ServiceInputProcessor.php(128): ReflectionClass->__construct('')\n#1 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\Webapi\\ServiceInputProcessor.php(262): Magento\\Framework\\Webapi\\ServiceInputProcessor->_createFromArray(NULL, '30')\n#2 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\Webapi\\ServiceInputProcessor.php(99): Magento\\Framework\\Webapi\\ServiceInputProcessor->convertValue('30', NULL)\n#3 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\module-webapi\\Controller\\Rest.php(262): Magento\\Framework\\Webapi\\ServiceInputProcessor->process('Test\\\\Calculator...', 'add', Array)\n#4 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\module-webapi\\Controller\\Rest.php(160): Magento\\Webapi\\Controller\\Rest->processApiRequest()\n#5 P:\\wwwroot\\Magento202_com_loc\\Web\\var\\generation\\Magento\\Webapi\\Controller\\Rest\\Interceptor.php(24): Magento\\Webapi\\Controller\\Rest->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n#6 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\App\\Http.php(115): Magento\\Webapi\\Controller\\Rest\\Interceptor->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n#7 P:\\wwwroot\\Magento202_com_loc\\Web\\vendor\\magento\\framework\\App\\Bootstrap.php(258): Magento\\Framework\\App\\Http->launch()\n#8 P:\\wwwroot\\Magento202_com_loc\\Web\\index.php(39): Magento\\Framework\\App\\Bootstrap->run(Object(Magento\\Framework\\App\\Http))\n#9 {main}"

Ich kann Magento Out-of-the-Box-REST-Webdienste erfolgreich aufrufen.

App / Code / Test / Rechner / Registrierung.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Test_Calculator',
__DIR__
);

app / code / Test / Calculator / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Test_Calculator" setup_version="1.0.0"/>
</config>

app / code / Test / Calculator / etc / webapi.xml

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">

    <route url="/V1/calculator/add/:num1/:num2" method="GET">
        <service class="Test\Calculator\Api\CalculatorInterface" method="add"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

app / code / Test / Calculator / etc / di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Test\Calculator\Api\CalculatorInterface" type="Test\Calculator\Model\Calculator" />
</config>

app / code / Test / Calculator / Api / CalculatorInterface.php

<?php

namespace Test\Calculator\Api;

interface CalculatorInterface
{
    public function add($num1, $num2);
}

app / code / Test / Rechner / Modell / Rechner.php

<?php

namespace Test\Calculator\Model;

use Test\Calculator\Api\CalculatorInterface;

class Calculator implements CalculatorInterface
{
    public function add($num1, $num2) {
        return $num1 + $num2;
    }
}

REST-URL, die den Fehler zurückgibt:

http://local.magento202.com:81/index.php/rest/V1/calculator/add/30/70
Aydus-Matthew
quelle

Antworten:

26

In app / code / Test / Calculator / Api / CalculatorInterface.php ist ein DocBlock erforderlich, wie hier beschrieben: http://devdocs.magento.com/guides/v2.0/coding-standards/docblock-standard-general.html

<?php

namespace Test\Calculator\Api;

interface CalculatorInterface
{
    /**
     * Add two numbers.
     *
     * @param int $num1
     * @param int $num2
     * @return int
     */
    public function add($num1, $num2);
}
Aydus-Matthew
quelle
1
Ich habe den gleichen Fehler erhalten, weil ich @params anstelle von "@param" verwendet habe. Magento 2 ist zu streng in Code-Standards: P
Altaf Hussain
Was soll ich als Rückgabewert schreiben, wenn ich json Array zurückgeben möchte
Bhupendra Jadeja
[at] return array @Bhupendra Jadeja
Ying Style
@AltafHussain Ich weiß, dass es 2 Jahre her ist, aber es hat nichts mit Codierungsstandards zu tun. Es verwendet Reflektion, um die Validierung durchzuführen, sodass es "@param" nicht finden kann. Es ist, als ob Sie $ a setzen und später möchten, dass es als $ b verwendet wird, aber die PHP-Standards sind zu streng
DarkMukke
Sie, mein Herr, sind mein Held. Vielen Dank. Ich hätte nie gedacht, dass das wichtig wäre, aber es hat mein Problem behoben.
Seanbreeden
3

In meinem Fall war das Problem, dass ich "use" -Klausel in der Schnittstelle verwendet habe. Magento DocBlockReflection konnte das nicht verarbeiten und suchte nach einer Schnittstelle ohne vollständigen Namespace. So zum Beispiel im folgenden Code:

use My\Namespace\ExampleObjectInterface
interface ExampleObjectRepositoryInterface
{
/**
 * xyz
 * @param int $id
 * @return ExampleObjectInterface
 * @throws \Magento\Framework\Exception\NoSuchEntityException
 * @throws \Magento\Framework\Exception\LocalizedException
 */
public function getById($id);
}

Ich musste "use" -Klausel entfernen:

interface ExampleObjectRepositoryInterface
{
/**
 * xyz
 * @param int $id
 * @return \My\Namespace\ExampleObjectInterface
 * @throws \Magento\Framework\Exception\NoSuchEntityException
 * @throws \Magento\Framework\Exception\LocalizedException
 */
public function getById($id);
}
Maciej Pieprzyk
quelle
1

Stellen Sie sicher, dass der folgende Befehl erfolgreich ausgeführt wurde. Unterbrechen oder treffen Sie keinen API-Aufruf. Nach der Ausführung wird Ihr Problem behoben. Hat für mich gearbeitet.

php bin/magento setup:di:compile
L-Board
quelle