我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringCloud gateway如何修改返回数据

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringCloud gateway如何修改返回数据

版本说明

开源软件 版本
springboot 2.1.6.RELEASE
jdk 11.0.3

gradle

主要引入了springboot 2.1,lombok


plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
    id "io.freefair.lombok" version "3.6.6"
}apply plugin: 'io.spring.dependency-management'group = 'cn.buddie.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'repositories {
    mavenCentral()
}ext {
    set('springCloudVersion', "Greenwich.SR2")
}dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    compile 'org.projectlombok:lombok:1.18.8'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

yaml

定义路由及过滤器 test-route路由,当Path为/users时,转到uri中配置的链接http://127.0.0.1:8123/users中。使用UnionResult来过滤


spring:
  cloud:
    gateway:
      enabled: true
      routes:
      - id: test-route
        uri: http://127.0.0.1:8123/users
        predicates:
        - Path=/users
        filters:
        - UnionResult

filter

yaml中配置的filter名字,加“GatewayFilterFactory”,就是对应的过滤器Java类


package cn.buddie.demo.springcloudgateway.filter;import cn.buddie.demo.springcloudgateway.model.UnionResult;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyResponseBodyGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.rewrite.RewriteFunction;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
public class UnionResultGatewayFilterFactory extends ModifyResponseBodyGatewayFilterFactory {
    @Override
    public GatewayFilter apply(Config config) {
        return new ModifyResponseGatewayFilter(this.getConfig());
    }
    private Config getConfig() {
        Config cf = new Config();
        // Config.setRewriteFunction(Class<T> inClass, Class<R> outClass, RewriteFunction<T, R> rewriteFunction)
        // inClass 原数据类型,可以指定为具体数据类型,我这里指定为Object,是为了处理多种数据类型。
        //                      当然支持多接口返回多数据类型的统一修改,yaml中的配置,path,uri需要做相关调整
        // outClass 目标数据类型
        // rewriteFunction 内容重写方法
        cf.setRewriteFunction(Object.class, UnionResult.class, getRewriteFunction());
        return cf;
    }    private RewriteFunction<Object, UnionResult> getRewriteFunction() {
        return (exchange, resp) -> Mono.just(UnionResult.builder().requestId(exchange.getRequest().getHeaders().getFirst("cn-buddie.demo.requestId")).result(resp).build());
    }
}

model


package cn.buddie.demo.springcloudgateway.model;import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class UnionResult {
    private String requestId;
    private Object result;
}

SpringCloud gateway修改返回的响应体

问题描述:

在gateway中修改返回的响应体,在全局Filter中添加如下代码:


import org.springframework.core.Ordered;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class RequestGlobalFilter implements GlobalFilter, Ordered {
 //...
 
 @Override
 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  //...
  ResponseDecorator decorator = new ResponseDecorator(exchange.getResponse());
  return chain.filter(exchange.mutate().response(decorator).build());
 } @Override
 public int getOrder() {
  return -1000;
 }
}

通过.response(decorator)设置一个响应装饰器(自定义),以下是装饰器具体实现:


import cn.hutool.json.JSONObject;
import org.reactivestreams.Publisher;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.charset.Charset;
public class ResponseDecorator extends ServerHttpResponseDecorator{
 public ResponseDecorator(ServerHttpResponse delegate){
  super(delegate);
 } @Override
 @SuppressWarnings(value = "unchecked")
 public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {  if(body instanceof Flux) {
   Flux<DataBuffer> fluxBody = (Flux<DataBuffer>) body;   return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
    DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
    DataBuffer join = dataBufferFactory.join(dataBuffers);    byte[] content = new byte[join.readableByteCount()];
    join.read(content);
    DataBufferUtils.release(join);// 释放掉内存
    
    String bodyStr = new String(content, Charset.forName("UTF-8"));                //修改响应体
    bodyStr = modifyBody(bodyStr);    getDelegate().getHeaders().setContentLength(bodyStr.getBytes().length);
    return bufferFactory().wrap(bodyStr.getBytes());
   }));
  }
  return super.writeWith(body);
 }    //重写这个函数即可
 private String modifyBody(String jsonStr){
  JSONObject json = new JSONObject(jsonStr);
        //TODO...修改响应体
  return json.toString();
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringCloud gateway如何修改返回数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

fiddler如何设置断点修改返回数据

在使用Fiddler进行断点调试时,可以通过以下步骤来设置断点并修改返回数据:1. 打开Fiddler,确保它已经开始监听网络请求。2. 在Fiddler的菜单栏中,选择“Rules” -> “Customize Rules”。3. 在打开
2023-09-21

没有返回值的Go函数如何修改数据?

来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《没有返回值的Go函数如何修改数据?》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!问题内容我不明白 bubblesort
没有返回值的Go函数如何修改数据?
2024-04-05

django如何返回json数据

在Django中返回JSON数据,通常有两种方式:1. 使用`JsonResponse`类:可以将Python字典转换为JSON格式,并返回一个包含JSON数据的HTTP响应。示例代码如下:```pythonfrom django.http
2023-10-09

Mybatis如何返回Map数据

本篇内容主要讲解“Mybatis如何返回Map数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mybatis如何返回Map数据”吧!一. 方式1接口public interface UserM
2023-07-01

php如何把修改数据更新回数据库

要把修改的数据更新回数据库,可以使用PHP中的UPDATE语句。首先,你需要连接到数据库。可以使用mysqli或PDO等PHP扩展来实现数据库连接。然后,构造UPDATE语句,指定要更新的表、要更新的字段以及更新条件。例如:```php$q
2023-08-17

如何从 PHP 函数返回数据?

php 函数可以通过以下方式返回数据:使用 return 语句隐式类型转换返回数组返回一个对象如何从 PHP 函数返回数据PHP 函数可以返回数据,允许我们在函数调用时访问函数计算的结果。这里介绍了返回数据的几种方法:1. 使用 ret
如何从 PHP 函数返回数据?
2024-04-10

ajax返回的数据如何取

要从ajax返回的数据中获取特定的值,需要通过解析返回的数据进行处理。通常返回的数据是一个字符串,可以使用JSON.parse()函数将其解析为JavaScript对象。然后可以通过访问对象的属性来获取特定的值。下面是一个简单的示例,演示如
2023-09-15

如何从 PHP 函数返回数据?

php 函数可以通过以下方式返回数据:使用 return 语句隐式类型转换返回数组返回一个对象如何从 PHP 函数返回数据PHP 函数可以返回数据,允许我们在函数调用时访问函数计算的结果。这里介绍了返回数据的几种方法:1. 使用 ret
如何从 PHP 函数返回数据?
2024-04-10

SpringBoot如何返回Json数据格式

这篇文章主要介绍了SpringBoot如何返回Json数据格式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-22

使用php如何返回json数据

使用php如何返回json数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampSer
2023-06-14

thinkphp如何返回某几条数据

这篇文章主要介绍“thinkphp如何返回某几条数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkphp如何返回某几条数据”文章能帮助大家解决问题。一、返回某几条数据的需求场景在Web开发
2023-07-05

如何在nestjs中返回前端数据

这篇文章主要介绍了如何在nestjs中返回前端数据,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!一、返回的数据格式对比1、直接返回的数据格式{ "id": 1, "uuid": "cbbe7abc-
2023-06-06

springboot返回数据量大如何处理

当Spring Boot应用程序需要返回大量数据时,以下是一些处理方法:1. 分页查询:可以使用Spring Data JPA或其他ORM工具来实现分页查询,将数据分成多个页返回给客户端。客户端可以通过请求参数指定要返回的页数和每页的大小。
2023-09-17

sqlserver如何修改数据

要修改SQL Server中的数据,可以使用UPDATE语句。以下是一个基本的示例:UPDATE 表名SET 列名1 = 新值1, 列名2 = 新值2WHERE 条件;例如,要将表中名为“张三”的学生的成绩修改为90分,可以编写如下的
sqlserver如何修改数据
2024-04-12

plsql如何修改数据

在PL/SQL中,可以使用UPDATE语句来修改数据。UPDATE语句的语法如下:UPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录