magento2 开发Api接口实例
magento2 开发Api接口实例
新建一个模块
第一步先创建module.xml初始化模块
模块配置 – 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="Max_Hello" setup_version="1.0.0" /> </config>
然后新建Registration
注册模块 – registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Max_Hello', __DIR__ );
API 的配置
这里需要建立两个xml文件di.xml和webapi.xml,其中di用于依赖注入,而webapi用于设定路由和指定方法名称,同时设定访问权限
Web API 配置 – 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/hello/name/:name" method="GET"> <service class="Max\Hello\Api\HelloInterface" method="name"/> <resources> <resource ref="anonymous"/> </resources> </route> </routes>
我们使用anonymous设置,让其可以直接通过url访问
注入声名 – 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="Max\Hello\Api\HelloInterface" type="Max\Hello\Model\Hello" /> </config>
创建接口文件 – Api/HelloInterface.php
<?php namespace Max\Hello\Api; interface HelloInterface{ /** * Returns greeting message to user * * @api * @param string $name Users name. * @return string Greeting message with users name. */ public function name($name); }
新建Model – Model/Hello.php
<?php namespace Max\Hello\Model; use Max\Hello\Api\HelloInterface; class Hello implements HelloInterface{ /** * Returns greeting message to user * * @api * @param string $name Users name. * @return string Greeting message with users name. */ public function name($name) { return "Hello, " . $name; } }
这里必须在声名方法前加上正确格式的注释,注明参数类型和返回类型,不然接口会报Class does not exist
这我猜测因为它是基于soap的接口,但php是弱类型命名的,所以在类似WSDL中其他强类型命名的想调用,出于考虑Magento强制把类型定义放到注释上,但这是一个大坑,如果不知道的人很可能也会遇到这个问题。
测试Rest Api
Rest Api格式如下:
http://{domain_name}/rest/V1/{method}/{attribute}/{value}
浏览器直接打开地址如下:
如: http://magento2.dev/rest/V1/hello/name/world
浏览器会显示以下结果:
<response>Hello, world</response>
SOAP方式访问:
<?php $proxy = new SoapClient('http://magento2.dev/index.php/soap/default?wsdl&services=maxHelloV1'); $result = $proxy->maxHelloV1Name(array("name"=>"world")); var_dump($result);
SOAP打印结果
object(stdClass)#2 (1) { ["result"]=> string(10) "Hello, world"}
ACL.XML
若不在WebApi使用anonymous权限,我们需要在etc文件夹新建一个acl.xml文件
如: – 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了。
参考:
admin 编辑问题