Lỗi API API Magento2 'Lớp không tồn tại'


12

Tôi đã tạo thử nghiệm dịch vụ web Magento 2.0.2 REST dựa trên blog của Alan: http://alankent.me/2015/07/24/creating-a-new-rest-web-service-in-magento-2/

Tôi đang sử dụng Postman để gọi dịch vụ web tùy chỉnh và gặp lỗi sau:

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

Tôi có thể gọi thành công các dịch vụ web REST ngoài luồng của Magento.

ứng dụng / mã / Kiểm tra / Máy tính / đăng ký.php

<?php

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

ứng dụng / mã / Kiểm tra / Máy tính / 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>

ứng dụng / mã / Kiểm tra / Máy tính / 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>

ứng dụng / mã / Kiểm tra / Máy tính / 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>

ứng dụng / mã / Kiểm tra / Máy tính / Api / CalculatorInterface.php

<?php

namespace Test\Calculator\Api;

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

ứng dụng / mã / Kiểm tra / Máy tính / Mô hình / Máy tính.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 trả về lỗi:

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

Câu trả lời:


26

Cần có một DocBlock trong ứng dụng / mã / Kiểm tra / Máy tính / Api / CalculatorInterface.php như được mô tả ở đây: http://devdocs.magento.com/guides/v2.0/coding-stiterias/docblock-stiteria-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
Tôi đã nhận được cùng một lỗi, vì tôi đã sử dụng @params thay vì "@param". Magento 2 quá khắt khe về tiêu chuẩn mã: P
Altaf Hussain

Tôi nên viết gì dưới dạng giá trị trả về nếu tôi muốn trả về mảng json
Bhupendra Jadeja

[at] trả về mảng @Bhupendra Jadeja
Ying Style

@AltafHussain Tôi biết đã được 2 năm, nhưng nó không liên quan gì đến các tiêu chuẩn mã hóa, là sử dụng sự phản chiếu để thực hiện xác nhận, vì vậy nó không thể tìm thấy "@param" nó sẽ chỉ phá vỡ điểm. Giống như bạn đặt $ a và sau đó muốn sử dụng làm $ b nhưng các tiêu chuẩn php quá nghiêm ngặt
DarkMukke

Ngài là người hùng của tôi. Cảm ơn bạn. Tôi sẽ không bao giờ nghĩ rằng điều đó có vấn đề nhưng nó đã khắc phục vấn đề của tôi.
seanbreeden

3

Trong trường hợp của tôi, vấn đề là tôi đã sử dụng mệnh đề "sử dụng" trong giao diện. Magento DocBlockReflection không thể xử lý điều đó và đang tìm kiếm giao diện mà không có không gian tên đầy đủ. Vì vậy, ví dụ trong mã dưới đây:

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

Tôi cần xóa mệnh đề "sử dụng":

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

1

Hãy chắc chắn rằng lệnh dưới đây được thực hiện thành công. Không làm gián đoạn hoặc nhấn bất kỳ cuộc gọi API nào. Sau khi thực hiện vấn đề của bạn sẽ được giải quyết. Đã làm cho tôi.

php bin/magento setup:di:compile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.