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、anonymous、Magento资源。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
来源:oschina
链接:https://my.oschina.net/ganfanghua/blog/3158592