Erreur de l'API REST Magento2 'La classe n'existe pas'

12

J'ai créé un service Web de test Magento 2.0.2 REST basé sur le blog d'Alan: http://alankent.me/2015/07/24/creating-a-new-rest-web-service-in-magento-2/

J'utilise Postman pour appeler le service Web personnalisé et obtenir l'erreur suivante:

"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}"

Je peux appeler avec succès les services Web REST prêts à l'emploi de Magento.

app / code / Test / Calculatrice / registration.php

<?php

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

app / code / Test / Calculatrice / 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 / Calculatrice / 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 / Calculatrice / 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 / Calculatrice / Api / CalculatorInterface.php

<?php

namespace Test\Calculator\Api;

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

app / code / Test / Calculatrice / Modèle / Calculatrice.php

<?php

namespace Test\Calculator\Model;

use Test\Calculator\Api\CalculatorInterface;

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

URL REST qui renvoie l'erreur:

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

Réponses:

27

Un DocBlock est requis dans app / code / Test / Calculator / Api / CalculatorInterface.php comme décrit ici: 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
la source
1
Je recevais la même erreur, car j'ai utilisé @params au lieu de "@param". Magento 2 est trop strict dans les normes de code: P
Altaf Hussain
que dois-je écrire comme valeur de retour si je veux retourner un tableau json
Bhupendra Jadeja
[at] return array @Bhupendra Jadeja
Ying Style
@AltafHussain Je sais que cela fait 2 ans, mais cela n'a rien à voir avec les normes de codage, utilise la réflexion pour faire la validation, donc il ne peut pas trouver "@param", il va juste briser le vide. C'est comme si vous définissiez $ a et que vous souhaitez plus tard l'utiliser comme $ b mais les normes php sont trop strictes
DarkMukke
Vous, monsieur, êtes mon héros. Je vous remercie. Je n'aurais jamais pensé que cela aurait été important, mais cela a résolu mon problème.
seanbreeden
4

Dans mon cas, le problème était que j'utilisais la clausule "use" dans l'interface. Magento DocBlockReflection ne pouvait pas gérer cela et cherchait une interface sans espace de noms complet. Ainsi, par exemple dans le code ci-dessous:

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);
}

Je devais supprimer la clausule "use":

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
la source
omg, tu m'as sauvé la vie. Je déboguais cela pendant des heures. Pourquoi le framework magento est-il si difficile à utiliser :(
Alex
1

Assurez-vous que la commande ci-dessous a été exécutée avec succès. N'interrompez ni n'appuyez sur aucun appel d'API. Après l'exécution, votre problème sera résolu. A travaillé pour moi.

php bin/magento setup:di:compile
L-Board
la source