6

I started on Magento2 Custom rest API module creation for that i follow the below post

API Module for Magneto2

url:- http://localhost/magento2a/rest/V1/calculator/add/1/2

app/code/AlanKent/CalculatorWebService/etc/module.xml

<?xml version="1.0"?>
<!--
/**
 * @copyright Copyright (c) 2015 X.commerce, Inc. (http://www.magentocommerce.com)
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
 <module name="AlanKent_CalculatorWebService" setup_version="2.0.0"/>
</config>

app/code/AlanKent/CalculatorWebService/etc/di.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
 <preference for="AlanKent\CalculatorWebService\Api\CalculatorInterface"
 type="AlanKent\CalculatorWebService\Model\Calculator" />
</config>

app/code/AlanKent/CalculatorWebService/etc/webapi.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
 <!-- Example: curl http://127.0.0.1/index.php/rest/V1/calculator/add/1/2 -->
 <route url="/V1/calculator/add/:num1/:num2" method="GET">
 <service class="AlanKent\CalculatorWebService\Api\CalculatorInterface" method="add"/>
 <resources>
 <resource ref="anonymous"/>
 </resources>
 </route>
</routes>

app/code/AlanKent/CalculatorWebService/Api/CalculatorInterface.php

<?php
/**
 * Copyright 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace AlanKent\CalculatorWebService\Api;
use AlanKent\CalculatorWebService\Api\Data\PointInterface;
/**
 * Defines the service contract for some simple maths functions. The purpose is
 * to demonstrate the definition of a simple web service, not that these
 * functions are really useful in practice. The function prototypes were therefore
 * selected to demonstrate different parameter and return values, not as a good
 * calculator design.
 */
interface CalculatorInterface
{
 /**
 * Return the sum of the two numbers.
 *
 * @return int The sum of the numbers.
 */
 public function add($num1, $num2);
}

app/code/AlanKent/CalculatorWebService/Model/Calculator.php

<?php
/**
 * Copyright 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace AlanKent\CalculatorWebService\Model;
use AlanKent\CalculatorWebService\Api\CalculatorInterface;
/**
 * Defines the implementaiton class of the calculator service contract.
 */
class Calculator implements CalculatorInterface
{
 /**
 * Return the sum of the two numbers.
 *
 * @api
 * @param int $num1 Left hand operand.
 * @param int $num2 Right hand operand.
 * @return int The sum of the two values.
 */
 public function add($num1, $num2) {
 return $num1 + $num2;
 }
}

it work fine for me

Guys if you get error

 [2015年10月14日 09:24:54] main.CRITICAL: exception 'InvalidArgumentException' with message 'Report ID: webapi-561e0346e13a1; Message: Each getter must have description with @return annotation. See Magento\Catalog\Api\ProductTypeListInterface::getTests()' in D:\xampp\htdocs\magento2a\lib\internal\Magento\Framework\Webapi\ErrorProcessor.php:194

then make sure in Interface file where you declare the function above that there should be @return in comments else it will through error

that is getTests its my new method aove that i have comment with @return if you missed the it will through the error

<?php
/**
 * Product type provider
 *
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Catalog\Api;
/**
 * @api
 */
interface ProductTypeListInterface
{
 /**
 * Retrieve available product types
 *
 * @return \Magento\Catalog\Api\Data\ProductTypeInterface[]
 */
 public function getProductTypes();
 **/**
 * Retrieve available product types
 *
 * @return
 */**
 public function getTests();
}

it look wired but its works above is the solution for Error

main.CRITICAL: exception 'InvalidArgumentException' with message 'Report ID: webapi-561e0346e13a1; Message: Each getter must have description with @return annotation. 

Note:- once module is pasted dont forget to run upgrade command that is D:\xampp\php>php D:\xampp\htdocs\magento2a\bin\magento setup:upgrade

(in local system i have php in D drive so change as per your system)

FireBear
2,1201 gold badge17 silver badges27 bronze badges
asked Oct 14, 2015 at 7:44
1
  • Why do you have comment like ` **/**`? Commented Oct 14, 2015 at 7:53

2 Answers 2

4

The interface must have proper dock blocks with the existing types. But your code doesn't have a return type. For example:

<?php 
/**
 * Product type provider
 *
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Catalog\Api;
/**
 * @api
 */
interface ProductTypeListInterface
{
 /**
 * Retrieve available product types
 *
 * @return \Magento\Catalog\Api\Data\ProductTypeInterface[]
 */
 public function getProductTypes();
 /**
 * Retrieve available tests
 *
 * @return \Vendor\Module\Api\Data\TestInterface[]
 */
 public function getTests();
}
Maddy
1,58610 silver badges14 bronze badges
answered Oct 14, 2015 at 7:57
1
  • :- i just gave below code it works code<?php namespace AlanKent\CalculatorWebService\Api; use AlanKent\CalculatorWebService\Api\Data\PointInterface; interface CalculatorInterface { /** * Return the sum of the two numbers. * * @api * @param int $num1 * @param int $num2 * @return */ public function add($num1, $num2); } code Commented Oct 14, 2015 at 9:09
2

@Kandy

i used below code it working fine for me important is dont ignore the comments which is consider as param

<?php
namespace AlanKent\CalculatorWebService\Api;
use AlanKent\CalculatorWebService\Api\Data\PointInterface;
interface CalculatorInterface
{
 /**
 * Return the sum of the two numbers.
 *
 * @api
 * @param int $num1
 * @param int $num2
 * @return
 */
 public function add($num1, $num2);
}
answered Oct 14, 2015 at 10:40

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.