magento webapi 接口返回 json对象

news2024/11/20 2:29:30

前言

现在主流的项目开发都是前后端分离,数据通过json对象格式进行传输。但是magento框架,和传统PHP框架相比,区别很大。虽然也支持以RestApi的形式传输数据,但是要么格式并非是传统jsonObject要么就是需要大量的get、set方法。本文就是在此基础上使用插件对原来的数据返回进行了封装,实现了接口可以返回json对象。

前置条件(创建一个可供访问的接口模块)

  1. 自定义创建一个模块,并在模块下面创建访问的包
模块: /app/code/Mageplaza (路径固定,名称随便取)
包:/app/code/Mageplaza/JsonReturn

在这里插入图片描述

  1. 定义接口
创建接口文件:/app/code/Mageplaza/JsonReturn/Api/JsonDataInterface (路径固定,名字随便起) 一定得是interface文件

在这里插入图片描述

  1. 创建路由
定义di配置文件、webapi 配置文件和 module配置文件

在这里插入图片描述
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="Mageplaza\JsonReturn\Api\JsonDataInterface" type="Mageplaza\JsonReturn\Model\ReturnJson"/>
</config>

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="Mageplaza_JsonReturn" setup_version="1.0.0">
    </module>
</config>

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 method="GET" url="/V1/json-return">
        <service class="Mageplaza\JsonReturn\Api\JsonDataInterface" method="returnJsonData"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>
  1. 定义模型用来实现接口
Model:/app/code/Mageplaza/JsonReturn/Model/ReturnJson
<?php


namespace Mageplaza\JsonReturn\Model;


use Mageplaza\JsonReturn\Api\JsonDataInterface;

class ReturnJson implements JsonDataInterface
{
    /**
     * @inheritDoc
     */
    public function returnJsonData()
    {
        return [
            'item' =>
                [
                    [
                        'name' => '蔡徐坤', 'age' => 234,
                        'hobby' => ['key' => '唱', '跳', 'rap', '篮球']
                    ],
                    [
                        'name' => '坤坤', 'age' => 124,
                        'hobby' => ['key' => '说唱', '跳高', 'rap', '篮球']
                    ],
                ],
            'msg' => '提示信息',
            'code' => 200
        ];
    }
}

  1. 定义注册文件(必须要 固定的)
/app/code/Mageplaza/JsonReturn/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Mageplaza_JsonReturn',
    __DIR__
);

运行发现问题

前置条件创建完成后,清楚缓存,进行升级,在postman进行访问
php bin/magento s:up

在post进行访问

http://{{host}}/rest/V1/json-return  访问api 路径前面需要带上rest

想要的格式是这样的

{
    "item": [
        {
            "name": "蔡徐坤",
            "age": 234,
            "hobby": {
                "key": "唱",
                "0": "跳",
                "1": "rap",
                "2": "篮球"
            }
        },
        {
            "name": "坤坤",
            "age": 124,
            "hobby": {
                "key": "说唱",
                "0": "跳高",
                "1": "rap",
                "2": "篮球"
            }
        }
    ],
    "msg": "提示信息",
    "code": 200
}

但最后的结果是这样的
在这里插入图片描述
item、msg、code 属性统统消失。前端肯定没法处理这种数据。这就是问题所在。

解决办法:

从网上搜到了一些解决办法,选择了其中一个非常nice的分享出来
外国盆友的解决办法
在这里插入图片描述
按照该方法,我们对原来的文件进行修改。

  1. 新建插件文件
/app/code/Mageplaza/JsonReturn/Plugin/ServiceOutputProcessorPlugin.php (路径固定,文件名随便起)
<?php


namespace Mageplaza\JsonReturn\Plugin;


use Magento\Framework\Webapi\ServiceOutputProcessor;

class ServiceOutputProcessorPlugin
{
    public function aroundConvertValue(ServiceOutputProcessor $subject, callable $proceed, $data, $type)
    {
        if ($type == 'array') {
            return $data;
        }
        return $proceed($data, $type);
    }
}

  1. 修改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="Mageplaza\JsonReturn\Api\JsonDataInterface" type="Mageplaza\JsonReturn\Model\ReturnJson"/>
    <type name="Magento\Framework\Webapi\ServiceOutputProcessor">
        <plugin name="mageplaza_jsonReturnplugin" type="Mageplaza\JsonReturn\Plugin\ServiceOutputProcessorPlugin" disabled="false"/>
    </type>
</config>

升级项目,进行测试

结果:已经符合预期
在这里插入图片描述

新的问题

这种是通过插件,修改了框架原本的返回接口。magento通过插件修改的类,这种形式是对全局生效的。那么就又有问题了,如果之前已有的代码使用了框架最初的返回结果,或者说,今后需要使用框架原生的返回值,那么通过插件修改,会导致原来的项目运行出问题,没法兼容框架代码!!!

解决办法

查看插件代码,发现插件是对 Webapi/ServiceOutputProcessor.php 这个文件进行了 二次封装,主要涉及到的方法是 convertValue

Webapi/ServiceOutputProcessor.php

在这里插入图片描述
$result[] = $datum;
这一步就是将原来的返回 关联数组的结构 key=>value 改成了 索引数组 导致了 返回出去的数据 最外面有一层 [] ,并且原先的 item,data等属性全部消失。

插件的写法作用

在这里插入图片描述
在这里插入图片描述

最终改版

综上所述,了解了 插件的写法原理,我们对插件进行优化,将原先常用的 array返回类型,改成自定义的名字,可以随便填,需要和插件里面的代码保持一致就行。这里我用jsonObject 。
在这里插入图片描述
在这里插入图片描述

结束语

到此我们就完成了对magento webapi返回值的修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TypeScript学习笔记以及学习中遇到的问题

本笔记是来自翻阅xcatliu的typeScript入门教程文档、TypeScript官方文档的部分摘录、以及观看B站学习视频进行笔记记录与知识点补充、本人实际使用时遇到的问题与解决记录、碎片化接触到相关知识点合并整理而成 仅供本人洪的学习使用 hello TypeScript 一、TypeScript安装 Ty…

【QT】如何检测目录或文件中的内容被修改,可以使用QFileSystemWatcher类进行检测

目录 1. QFileSystemWatcher类的介绍2. QFileSystemWatcher的公共函数2.1 构造函数2.2 析构函数2.3 添加监控的路径2.4 返回正在监控的目录或文件2.5 从文件系统监视程序中删除指定的路径 3. QFileSystemWatcher的信号4. 测试代码4.1 操作步骤4.2 MainWindow.h4.3 MainWindow.c…

Spring之Bean的配置与实例

Spring之Bean的配置与实例 一、Bean的基础配置1. Bean基础配置【重点】配置说明代码演示运行结果 2. Bean别名配置配置说明代码演示打印结果 3. Bean作用范围配置【重点】配置说明代码演示打印结果 二、Bean的实例化1. Bean是如何创建的2. 实例化Bean的三种方式2.1 构造方法方式…

数据库系统-数据库查询实现算法之

文章目录 一、一趟扫描算法1.1 算法概述1.2 算法逻辑&物理实现1.2.1 逻辑层面1.2.2 物理层面1.2.2.1 P11.2.2.2 P21.2.2.3 P31.2.2.4 P4 1.3 迭代器构造查询实现算法1.4 关系操作的一趟扫描算法1.4 基于索引的查询实现算法 二、两趟扫描算法2.1 两趟算法基本思想2.2 多路归…

SaaS是什么?企业为什么要有SaaS系统?

什么是SaaS系统&#xff1f;企业为什么要有SaaS系统&#xff1f; 近几年&#xff0c;SaaS突然变成了一个热门词汇&#xff0c;无论是一些权威报告&#xff0c;还是知乎上知友们热烈的讨论&#xff0c;对于Saas系统可谓是各有各的见解和看法。 今天就综合几位答主的观点&#…

【1163. 按字典序排在最后的子串】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xff1a; 输入&#xff1a;s "abab" 输出&#xff1a;"bab"…

安波福又有大动作,行泊一体中国方案即将量产

“安波福的目标是&#xff0c;2030年营收达到400亿美元规模&#xff0c;这其中有一大部分收入来自于软件。”安波福亚太区总裁杨晓明在接受高工智能汽车提问时表示。 他介绍&#xff0c;2030年软件业务目标是达到60亿美元的规模&#xff0c;而在2022年&#xff0c;安波福实现了…

Nacos身份绕过漏洞复现(QVD-2023-6271)

Nacos身份绕过漏洞复现&#xff08;QVD-2023-6271&#xff09; 公司上级预警QVD-2023-6271&#xff0c;领导安排进行排查。 本着知己知彼的原则&#xff0c;我在本地将该漏洞复现出来。 漏洞原理&#xff1a;Nacos 在默认配置下未对 token.secret.key 进行修改&#xff0c;导…

【好题】好题分享

1001-四舍五入_牛客竞赛语法入门班数组模拟、枚举、贪心习题 (nowcoder.com) 题目描述 四舍五入是个好东西。比如你只考了45分&#xff0c;四舍五入后你是50分再四舍五入你就是满分啦&#xff01;qdgg刚考完拓扑。成绩十分不理想。但老师觉得他每天都很认真的听课很不容易。于是…

ubuntu 22 安装

下载镜像 下载 https://ubuntu.com/download/server 我这里下载了 22 服务器版 使用工具制作U盘镜像 安装完毕后 插入安装的电脑U盘插口 DEL 进入 选择U盘启动 进入后 我这里选择了第一个&#xff0c;没有选择mini版本 之后进入后按推荐一直安装 在选择静态地址的时候 subn…

你还在用Object.equals()方法吗?

当《阿里巴巴Java开发手册》发布后&#xff0c;我也是仔细进行了阅读&#xff0c;想从中找出一些“标准”&#xff0c;让自己的代码质量提高。手册中对 Object 的 equals 方法的使用进行了强制&#xff0c;而且推荐使用 JDK7 中工具类 Objects 的 equals 方法&#xff0c;至此之…

我在 Linux部署皕杰报表遇到的问题及解决方法

Linux是一种自由和开放源码的类 UNIX 操作系统&#xff0c;作为服务器的操作系统广泛应用。Linux由林纳斯托瓦兹在赫尔辛基大学上学时创立&#xff0c;主要受到 Minix 和 Unix 思想的启发。Linux英文解释为 Linux is not Unix。 皕杰报表支持在linux系统中部署&#xff0c;只需…

短视频矩阵优化系统开发步骤:

1. 矩阵号注册&#xff1a;用户可以通过该功能注册矩阵号&#xff0c;填写个人基本信息并上传身份证明材料进行实名认证。 2. 矩阵号登录&#xff1a;用户使用注册成功的账号密码登录矩阵号系统。 3. 矩阵号管理&#xff1a;用户可以通过该功能管理自己的矩阵号&#xff0c;包…

3 亿岗位将被 AI 取代?巴比特深度采访业界后,“失业潮”真相有些出人意料……...

图片来源&#xff1a;由无界 AI工具生成 人工智能技术的发展正迎来奇点&#xff0c;尤其是今年以来 ChatGPT 和 AIGC 的迅猛势头让无数人猝不及防&#xff0c;真真切切地对各行各业现有的工作岗位产生冲击。近日&#xff0c;蓝色光标全面停止创意设计、方案撰写、文案撰写、短期…

Oracle:ORA-00600[4137]问题分析

背景: 在为用户的新机房环境Oracle 19.18版本数据库检查时&#xff0c;发现smon进程后台日志不断出现事务恢复报错Serial Transaction recovery caught exception 30319&#xff0c;进一步检查发现存在事务恢复失败报ORA-00600[4137] 问题: smon进程后台日志不断出现事务恢复报…

【对比】文心一言对飚ChatGPT实操对比体验

前言 &#x1f34a;缘由 百度【文心一言】体验申请通过 本狗中午干饭时&#xff0c;天降短信&#xff0c;告知可以体验文心一言&#xff0c;苦等一个月的实操终于到来。心中这好奇的对比心理油然而生&#xff0c;到底是老美的【ChatGPT】厉害&#xff0c;还是咱度娘的【文心一…

地下污水厂智能照明控制应用

摘要:结合某地下污水厂项目&#xff0c;从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统&#xff0c;探索了一套适用于地下污水厂的智能照明控制策略&#xff0c;以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…

苦熬10年,国产操作系统“归零”,新操作系统上新,跟Excel很像

苦熬10余年&#xff0c;国产操作系统自主研发 说到国内自主研发的操作系统&#xff0c;经验最丰富的品牌&#xff0c;当然是麒麟OS. 从诞生到发展&#xff0c;历经10多年的努力&#xff0c;麒麟os逐渐成为了国内自主研发操作系统领域中的一颗耀眼的明珠。麒麟OS不仅推出了许多…

Java基础(十)字符串相关类

1 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如"hello" &#xff09;都可以看作是实现此类的实例。 字符串是常量&#xff0c;用双引号引起来表示。它们的值在创…

​如何恢复回收站清空的文件?

清空回收站后可以恢复删除的文件吗&#xff1f; 你是否遇到过清空回收站后才意识到某些文件不应删除的情况。发生这种情况时&#xff0c;许多人会感到恐慌&#xff0c;并且想知道是否有可能恢复回收站清空的文件。 事实上&#xff0c;你不必为此担心。当用户清空回收站时&a…