具有输入参数的magento 2 api路线


8

我正在尝试使用输入参数创建一个api路由,但没有得到预期的结果。

这是我的webapi.xml:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
    <route url="/V1/foo" method="POST" secure="true">
        <service class="..\FooInterface"
                 method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
        <data>
            <parameter name="id" force="true">%id%</parameter>
        </data>
    </route>
</routes>

这是我的界面:

interface FooInterface
{
    /**
     * Test function
     *
     * @api
     * @param string $id
     * @return string
     */
    public function getFooById($id);
}

这里是班级:

class Foo implements FooInterface
{
    /**
     * {@inheritdoc}
     */
    public function getFooById($id){
        return $id;
    }
}

我忽略了带有首选项的di.xml。现在,如果我叫那条路线,我所要做的就是返回%id%。即使我不输入任何参数,我也可以得到它而不是错误或其他信息。

我在这里做错了什么?

这是邮递员的电话: 在此处输入图片说明 在此处输入图片说明

我试过了:

  • 发送获取请求
  • 发送带有参数的获取请求 /order?id=foo
  • 发送帖子请求
  • 发送带有表单数据的过帐请求
  • 发送带有原始数据的帖子请求(如屏幕截图所示)

所有结果都相同-> %id%

我正在使用社区版btw。


您有没有找到解决他问题的办法?请让我知道我面临同样的问题,谢谢
Purushotam Sharma,

抱歉,该公司离开了,无法再访问代码。我认为我做了我在上一个评论中唯一回答中的内容。
斯特罗斯

Answers:


4

检查核心模块后,发现parameterwebapi.xml 中的节点仅在客户模块中用于self资源类型。

下面的文件负责用值转换参数占位符。

/**
 * Replaces a "%customer_id%" value with the real customer id
 */
Magento\Webapi\Controller\Rest\ParamOverriderCustomerId 

现在,有两种方法可以在API中传递参数。

解决方案1:

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/foo" method="POST" secure="true">
        <service class="..\FooInterface" method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

$id在Interface类和实现定义中指定参数。在这种情况下,您需要将id作为正文内容传递。

解决方案2:

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/foo:id" method="POST" secure="true">
        <service class="..\FooInterface" method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

$id在Interface类和实现定义中指定参数。在这种情况下,您需要在URL中传递id作为参数。为此,您还可以检查产品模块。


是的,这正是我想要的,这是必需的!
steros

为什么要投票..没有得到。当您使用参数声明Inerface时。参数已经是必需的。如果您不添加webapi.xml。它会工作,我尝试了一下,但效果很好
Pankaj Pareek

也许不清楚?我特别想使用datawebapi.xml中的元素。仅将其省略会产生预期的输出,但不能解决实际的问题。
steros

啊,您使我想起了一些事情:“ * webapi.xml中的参数可以强制执行。这可以确保在特定路由上始终使用特定值。*例如,如果有” ... / me /。 。“路由,该路由应仅使用特定于*当前登录用户的用户信息。更具体地说,如果存在“ / customers / me / addresses”路由,则调用的服务方法*可以具有“ getAddresses( $ customerId)”,但在webapi.xml中,$ customerId参数*将被强制为当前经过身份验证的用户的客户ID。”
steros

可以在ParamOverriderInterface.php中找到-我现在生病了,在处理问题时遇到了麻烦,但是如果我在这种状态下正确的话。这些数据和参数元素与请求参数关系不大。取而代之的是,它们强制参数的值(无论其来自何处)。
steros
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.