magento webapi 接口返回 json对象

news/2024/4/27 11:42:48/文章来源:https://blog.csdn.net/FateDant/article/details/130326216

前言

现在主流的项目开发都是前后端分离,数据通过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
<?phpnamespace 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 (路径固定,文件名随便起)
<?phpnamespace 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.luyixian.cn/news_show_102557.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于xilinx使用PCIE实现FPGA的部分重配置实现(MCAP)

平台&#xff1a;vivado21018.3 芯片&#xff1a;xcku115-flva1517-2-i (active) 本文官方文档&#xff1a;Xilinx_Answer_64761_Ultrascale_Devices 本文驱动下载地址&#xff1a;64761 - Bitstream Loading across the PCI Express Link in UltraScale and UltraScale Dev…

JAVA——线程池

目录 一、线程池的概念 二、Java标准库中的线程池 三、ThreadPoolExecutor 类的参数 四、线程池的拒绝策略 五、模拟实现线程池 一、线程池的概念 线程池顾名思义就是集中存储线程的地方——联想一下水池。 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到…

Ext4日志优化-iJournaling

背景 这几年随着SSD等高性能介质的普及&#xff0c;及其在大规模分布式存储系统上的应用。基于Append only的日志写入技术也应用得越来越多&#xff0c;这几天刚好有空&#xff0c;重读了Ext4文件系统的日志部分的内容&#xff0c;也正好看到一篇对Ext4日志技术进行优化的论文…

《编码——隐藏在计算机软硬件背后的语言》精炼——第11章(门)

“The only source of knowledge is experience.” - Albert Einstein 引言 编码是一种处理并表达信息的方式&#xff0c;它包括摩斯电码、盲文、二进制语言等等&#xff0c;当然作为计算机类的经典书籍&#xff0c;这本书简述了计算机中以二进制数为基础的编码方式&#xff0…

nginx简单介绍

文章目录 1. 下载并解压2. 80端口被占用&#xff0c;更改nginx默认的监听端口3. 访问nginx4. 在linux上安装nginx5. nginx常用命令6. nginx.conf 1. 下载并解压 官网下载 2. 80端口被占用&#xff0c;更改nginx默认的监听端口 更改conf/nginx.conf文件 3. 访问nginx ht…

【Linux】popen pclose接口介绍

本篇文章简单讲述了c语言接口popen/pclose的用法 1.函数作用 函数定义如下 #include <stdio.h>FILE *popen(const char *command, const char *type); int pclose(FILE *stream);1.1 popen popen函数会创建一个管道&#xff0c;fork后调用shell来打开进程。由于管道的…

射频封装技术:层压基板和无源器件集成

射频和无线产品领域可以使用非常广泛的封装载体技术&#xff0c;它们包括引线框架、层压基板、低温共烧陶瓷&#xff08;LTCC&#xff09;和硅底板载体&#xff08;Si Backplane&#xff09;。由于不断增加的功能对集成度有了更高要求&#xff0c;市场对系统级封装方法&#xf…

Qt 项目Mingw编译器转换为VS编译器时的错误及解决办法

错误 在mingw生成的项目&#xff0c;转换为VS编译器时通常会报些以下错误&#xff08;C4819警告&#xff0c;C2001错误&#xff0c;C2143错误&#xff09; 原因及解决方式 这一般是由于字符编码引起的&#xff0c;在源代码文件中包含了中文字符导致的。Qt Creator 生成的代码文…

iptables防火墙和Firewalld

引言 在 Internet 中&#xff0c;企业通过各种应用系统来为用户提供各种服务&#xff0c;如 Web 网站、电子邮件系统、FTP 服务器、数据库系统等&#xff0c;那么&#xff0c;如何来保护这些服务器&#xff0c;过滤企业不需要的访问甚至是恶意的入侵呢&#xff0c;接下来&#…

【Linux】生产者消费者模型——环形队列RingQueue(信号量)

文章目录 铺垫信号量信号量概念信号量PV操作信号量基本接口 环形队列的生产消费模型引入环形队列访问环形队列代码实现代码改造多生产者多消费者代码 总结 铺垫 之前写的代码是存在不足的地方的&#xff1a; 我们使用线程操作临界资源的时候要先去判断临界资源是否满足条件&am…

最新动态 | 大势智慧参加广东省应急测绘保障与安全生产演练

4月20日&#xff0c;2023年度广东省应急测绘保障与安全生产演练在台山市赤溪镇鱼塘湾举行。本次演练由广东自然资源厅主办&#xff0c;广东省国土资源测绘院、江门市自然资源局和台山市人民政府承办。在省市各指导单位与参演单位的多方协同与指挥下&#xff0c;应急测绘保障与安…

【三十天精通Vue 3】第十四天 Vue 3 的单元测试详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、为什么要进行单元测试1.1 单元测试的概念1.2 单元测试的优…

ctfshow_WEB_web2 wp

前言 写这个是因为。。。我想摆烂&#xff0c;就去从最简单的题开始做了&#xff0c;想着交一道题是一道嘛&#xff0c;总之觉得这样做很适合欺骗安慰自己&#xff08;逃 然后我发现我错了&#xff0c;我第二道题就做了好久还没做出来&#xff0c;甚至最后去点开了hint…… ps…

Java网络编程系列之NIO

Java网络编程系列之NIO 1.Java NIO概述1.1 阻塞IO1.2 非阻塞IO1.3 NIO概述1.3.1 Channels1.3.2 Buffer1.3.3 Selector 2.Java NIO(Channel)2.1Channel概述2.2 Channel实现2.3 FileChannel 介绍与示例2.4 FileChannel 操作详解2.4.1 打开FileChannel2.4.2 从FileChannel读取数据…

自定义测试平台搭建

体验地址&#xff1a;TestManagePlatform 首次加载会比较慢... 功能点 1.数据工具生成&#xff0c;增删改查 2.测试用例以及测试套件生成&#xff0c;测试执行测试基础用例增删改查。 3.Jacoco 代码增量扫描 4.文章管理 欢迎私聊&#xff0c;支撑自定义开发。

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

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

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…

Allegro PCB后处理

Allegro PCB后处理&#xff0c;主要是完成线路设计以后&#xff0c;输出生产文件之前的处理。这是看教程做的记录&#xff0c;方便以后自己参考。 教程&#xff1a; [小哥Cadence Allegro 132讲字幕版PCB视频教程]_哔哩哔哩_bilibili 感觉关键是多看右边Options菜单&#xff0…

Simulation Extractable Versions of Groth’s zk-SNARK Revisited学习笔记

1. 引言 等人2020年论文《Simulation Extractable Versions of Groth’s zk-SNARK Revisited》&#xff0c;开源代码实现见&#xff1a; https://github.com/Baghery/ABPR22&#xff08;Rust&#xff0c;基于arkworks开发。使用了Multi-Scalar Multiplication (MSM)技术来优化…

linux下使用ftp下载服务器数据

首先确认服务器地址 比如我要从uniprot获取数据&#xff0c;需要先ping服务器地址&#xff1a; 可见&#xff0c;ftp地址不需要前面的https 匿名登录 匿名&#xff1a;anonymous 密码&#xff1a;任意邮箱&#xff0c;如123163.com 这里的传输模式我使用的是二进制&#xff…