magento2开发Api接口实例

醉酒当歌 提交于 2020-02-26 01:15:35

Vue项目所用的Magento2 Api文档

Api模块文件结构:

magento2接口流程:

1、访问接口地址:http://m2.olightstore.us/rest/default/V1/olightApi/abtest

2、指向/OlightApi/Api/AbtestInterface.php接口文件

3、由于di.xml和webapi.xml配置,所以会转向/OlightApi/Model/Abtest.php文件

 

一、模块配置-etc/module.xml

模块配置 – etc/module.xml

<?xml version="1.0" encoding="UTF-8"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">

    <module name="Silk_OlightApi" setup_version="0.0.1">

    </module>

</config>

 

二、注册模块registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(

   \Magento\Framework\Component\ComponentRegistrar::MODULE ,

   'Silk_OlightApi' ,

   __DIR__

);

 

三、Web API 配置 – etc/webapi.xml

备注:用于设定路由和指定方法名称,同时设定访问权限

权限resource定义谁有权限调用此API。它可以是每个人或自己或特定管理员用户。选项self、anonymousMagento资源Magento资源的值比如Magento_Catalog::products

self拿到令牌后就可以访问

anonymous使用匿名,这样所有人都能访问浏览器访问也行

<?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/olightApi/abtest" method="GET">

        <service class="Silk\OlightApi\Api\AbtestInterface" method="getAbActive"/>

        <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="Silk\OlightApi\Api\AbtestInterface" type="Silk\OlightApi\Model\Abtest" />

</config>

 

五、接口文件 – Api/AbtestInterface.php

特别注意:getAbActive()方法的注释,如果不加@return,会报错(Class does not exist

其中:\Silk\OlightApi\Api\Data\AbtestInformationInterface定义了该接口返回值。

再注意看 [] 这个数组符合,表示该接口返回一个二维数组,vue那边必须要二维数组。

<?php

namespace Silk\OlightApi\Api;

 

interface AbtestInterface

{

    /**

     * Get Ab Info

     * @return \Silk\OlightApi\Api\Data\AbtestInformationInterface[]

     */

    public function getAbActive();

}

 

六、接口返回值文件 – Api/Data/AbtestInformationInterface.php

备注:getType()表示返回type。从该文件可以看出,该接口返回值有:id,type,active

注意:id这个返回值,vue那边一定要的

<?php

/**

 * Copyright © Olight, Inc. All rights reserved.

 */

namespace Silk\OlightApi\Api\Data;

 

/**

 * AbTest Information interface.

 *

 * @api

 * @since 100.0.2

 */

interface AbtestInformationInterface extends \Magento\Framework\Api\ExtensibleDataInterface

{

    /**

     * Get abTest id value.

     *

     * @return string

     */

    public function getId();

 

    /**

     * Set abTest id value.

     *

     * @param string $id

     * @return $this

     */

    public function setId($id);

 

    /**

     * Get api type.

     *

     * @return string

     */

    public function getType();

 

    /**

     * Set api type.

     *

     * @param string $id

     * @return $this

     */

    public function setType($type);

 

    /**

     * Get abTest active value.

     *

     * @return string

     */

    public function getActive();

 

    /**

     * Set abTest active value.

     *

     * @param string $code

     * @return $this

     */

    public function setActive($active);

}

 

 

七、接口返回值文件 – Model/Data/AbtestInformation.php

备注:它实现了/Api/Data/AbtestInformationInterface.php接口,把所有返回值的方法都覆盖了,也就意味着上述说的返回值:id,type,active都有了。

<?php

/**

 * Copyright © Olight, Inc. All rights reserved.

 */

namespace Silk\OlightApi\Api\Data;

 

/**

 * AbTest Information interface.

 *

 * @api

 * @since 100.0.2

 */

interface AbtestInformationInterface extends \Magento\Framework\Api\ExtensibleDataInterface

{

    /**

     * Get abTest id value.

     *

     * @return string

     */

    public function getId();

 

    /**

     * Set abTest id value.

     *

     * @param string $id

     * @return $this

     */

    public function setId($id);

 

    /**

     * Get api type.

     *

     * @return string

     */

    public function getType();

 

    /**

     * Set api type.

     *

     * @param string $id

     * @return $this

     */

    public function setType($type);

 

    /**

     * Get abTest active value.

     *

     * @return string

     */

    public function getActive();

 

    /**

     * Set abTest active value.

     *

     * @param string $code

     * @return $this

     */

    public function setActive($active);

}

 

 

八、新建Model – Model/Abtest.php

备注:它实现了AbtestInterface接口,并实例化/model/Data/AbtestInformation.php。

注意:通过上述di.xml和webapi.xml配置,当访问接口地址时,就直接执行这个文件的getAbActive()方法,该方法就初始化返回值,并设置返回值。

再注意:这个getAbActive()方法的注释,与其实现的接口的该方法一样的,看上面

<?php

/**

 * Copyright © Olight, Inc. All rights reserved.

 */

namespace Silk\OlightApi\Model;

 

class Abtest implements \Silk\OlightApi\Api\AbtestInterface

{

    /**

     * @var send to vue,api id and type

     */

    const VUE_ID = '1000';

    const VUE_TYPE = 'ab';

 

    /**

     * @var \Silk\OlightApi\Model\Data\AbtestInformationFactory

     */

    protected $abtestInformationFactory;

 

    protected $scopeConfig;

 

    public function __construct(

        \Silk\OlightApi\Model\Data\AbtestInformationFactory $abtestInformationFactory,

        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig

    ) {

        $this->abtestInformationFactory = $abtestInformationFactory;

        $this->scopeConfig = $scopeConfig;

    }

 

    /**

     * Get Ab Info

     * @return \Silk\OlightApi\Api\Data\AbtestInformationInterface[]

     */

    public function getAbActive()

    {

        //init abTest model data

        $abInfo = $this->abtestInformationFactory->create();

 

        //set vue api id and type

        $id = empty(self::VUE_ID) ? '1000' : self::VUE_ID;

        $type = empty(self::VUE_TYPE) ? 'ab' : self::VUE_TYPE;

        $abInfo->setId($id);

        $abInfo->setType($type);

 

        //get atTest active value

        $scope = \Magento\Store\Model\ScopeInterface::SCOPE_STORE;

        $active = $this->scopeConfig->getValue('checkout/ab_test/active',$scope);

        $active = empty($active) ? 0 : 1;

 

        //set abTest model data value

        $abInfo->setActive($active);

        

        //return atTest api data

        $data = [];

        $data[] = $abInfo;

        return $data;

    }

}

 

九、测试Rest Api

Rest Api格式如下:

http://{domain_name}/rest/V1/{method}/{attribute}/{value}

浏览器直接打开地址如下:

如: http://m2.olightstore.us/rest/default/V1/olightApi/abtest

浏览器会显示以下结果:

<response>

<item>

<id>1000</id>

<type>ab</type>

<active>1</active>

</item>

</response>

Postman方式访问:

[

    {

        "id""1000",

        "type""ab",

        "active""1"

    }

]

从Postman工具访问,可以清楚地看到,api接口返回一个二维数组,返回的字段。

再次注意:vue那边需要api返回id字段,否则报错

 

十、权限acl.xml

webApi.xml不使用anonymous权限,我们需要建/etc/acl.xml文件

<?xml version= "1.0" ?> 

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nOnamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">    

<acl>         

<resources>             

<resource id="Magento_Backend::admin" >                 

<resource id="Max_Hello::hello" title="Hello" translate="title" sortOrder= "110" 

</resource>         

</resources>     

</acl> 

</config>

在这种情况下,我们需要在webapi.xml的resource节点中添加“Max_Hello ::hello”,这种操作后就可以不使用anonymous了。

 

 

尾声:再来一个webApi的例子,重点介绍acl和是否带参数的配置

Silk/Hello/etc/webapi.xml

Silk/Hello/etc/di.xml

Silk/Hello/Api/WorldInterface.php

Silk/Hello/Model/World.php

Silk/Hello/etc/acl.xml

接口一测试: http://gan.store.us/rest/default/V1/hello/ (无权限控制,所有人可访问,所以正常访问)

接口二测试: http://gan.store.us/rest/default/V1/hello/name/aa (有权限控制,提示)

并且,在后台:System->Extensions->Integrations(restApi集成)和System->Permissions->User Roles(用户角色),可以看到上述接口的权限管理配置

 

 

参考: https://bbs.mallol.cn/thread-177.htm

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!