Magento2 REST API错误“类不存在”


12

我已基于Alan的博客创建了一个测试Magento 2.0.2 REST Web服务:http : //alankent.me/2015/07/24/creating-a-new-rest-web-service-in-magento-2/

我正在使用Postman调用自定义Web服务并收到以下错误:

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

我可以成功地调用Magento的现成的REST Web服务。

应用程序/代码/测试/计算器/registration.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>

应用程序/代码/测试/计算器/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>

应用程序/代码/测试/计算器/Api/CalculatorInterface.php

<?php

namespace Test\Calculator\Api;

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

应用程序/代码/测试/计算器/模型/Calculator.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返回错误:

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

Answers:


27

如以下所述,在app / code / Test / Calculator / Api / CalculatorInterface.php中需要DocBlock: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);
}

1
我收到相同的错误,因为我使用@params而不是“ @param”。Magento 2的代码标准太严格了:P
Altaf Hussain

如果我想返回json数组,我应该写什么作为返回值
Bhupendra Jadeja,

[at]返回数组@Bhupendra Jadeja
Ying风格

@AltafHussain我知道已经有两年了,但是它与编码标准无关,它使用反射来进行验证,因此它找不到“ @param”,只会断点空白。就像您设置了$ a,然后又想将其用作$ b一样,但是php标准太严格了
DarkMukke

先生,您是我的英雄。谢谢。我从没想过那会很重要,但这解决了我的问题。
seanbreeden

4

就我而言,问题是我在界面中使用了“ use”子句。Magento DocBlockReflection无法处理该问题,并且正在搜索没有完整名称空间的接口。因此,例如下面的代码:

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

我需要删除“使用”子句:

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

天哪,你救了我的命。我已经调试了几个小时。为什么magento框架这么难使用:(
Alex

1

确保以下命令成功执行。请勿打扰或点击任何API调用。执行后,您的问题将得到解决。为我工作。

php bin/magento setup:di:compile
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.