首页 > 其他分享 >Q3

Q3

时间:2024-10-10 16:49:26浏览次数:2  
标签:Q3 return feign Bean import new public

在使用 OpenFeign 进行 HTTP 调用时,默认情况下,如果服务器返回的状态码不在 2xx 范围内(例如 307 临时重定向),Feign 会抛出 FeignException。然而,有时你可能希望处理这些状态码而不抛出异常,以便进行自定义的逻辑处理。解决方法你可以通过以下几种方式来处理 307 状态码而不抛出异常:1. 自定义 ErrorDecoder你可以实现一个自定义的 ErrorDecoder,在其中处理 307 状态码,并返回一个自定义的结果而不是抛出异常。import feign.Response;
import feign.codec.ErrorDecoder;

public class CustomErrorDecoder implements ErrorDecoder {

@Override
public Exception decode(String methodKey, Response response) {
    if (response.status() == 307) {
        // 处理 307 状态码
        // 例如,读取响应体并返回自定义结果
        try {
            String responseBody = Util.toString(response.body().asReader());
            return new CustomResult(responseBody);
        } catch (IOException e) {
            return new RuntimeException("Failed to read response body", e);
        }
    }
    // 对于其他状态码,可以使用默认的错误解码器
    return new Default().decode(methodKey, response);
}

}
然后,在你的 Feign 客户端中配置这个自定义的 ErrorDecoder:import feign.Feign;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import feign.slf4j.Slf4jLogger;

@FeignClient(name = "myClient", url = "https://example.com", configuration = MyClient.MyClientConfiguration.class)
public interface MyClient {

@RequestLine("GET /some-endpoint")
String getSomeData();

class MyClientConfiguration {
    @Bean
    public ErrorDecoder errorDecoder() {
        return new CustomErrorDecoder();
    }

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    public Logger logger() {
        return new Slf4jLogger(MyClient.class);
    }

    @Bean
    public JacksonEncoder jacksonEncoder() {
        return new JacksonEncoder();
    }

    @Bean
    public JacksonDecoder jacksonDecoder() {
        return new JacksonDecoder();
    }
}

}
2. 使用 Retryer 和 Request.Options如果你希望在遇到 307 状态码时自动重试请求,可以配置 Retryer 和 Request.Options。import feign.Retryer;
import feign.Request;

@FeignClient(name = "myClient", url = "https://example.com", configuration = MyClient.MyClientConfiguration.class)
public interface MyClient {

@RequestLine("GET /some-endpoint")
String getSomeData();

class MyClientConfiguration {
    @Bean
    public Retryer retryer() {
        return new Retryer.Default(5000, 5000, 3); // 初始间隔5秒,最大间隔5秒,最多重试3次
    }

    @Bean
    public Request.Options options() {
        return new Request.Options(5000, 10000); // 连接超时5秒,读取超时10秒
    }

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    public Logger logger() {
        return new Slf4jLogger(MyClient.class);
    }

    @Bean
    public JacksonEncoder jacksonEncoder() {
        return new JacksonEncoder();
    }

    @Bean
    public JacksonDecoder jacksonDecoder() {
        return new JacksonDecoder();
    }
}

}
3. 手动处理响应你也可以在调用 Feign 客户端后手动检查响应状态码,并根据需要进行处理。import feign.Response;
import feign.FeignException;

public class MyService {

private final MyClient myClient;

@Autowired
public MyService(MyClient myClient) {
    this.myClient = myClient;
}

public String fetchData() {
    try {
        Response response = myClient.getSomeData().toBuilder().build(); // 获取原始响应
        if (response.status() == 307) {
            // 处理 307 状态码
            // 例如,读取响应体并返回自定义结果
            try {
                String responseBody = Util.toString(response.body().asReader());
                return responseBody;
            } catch (IOException e) {
                throw new RuntimeException("Failed to read response body", e);
            }
        }
        // 其他状态码
        return response.body().toString();
    } catch (FeignException e) {
        // 处理其他异常
        throw new RuntimeException("Feign call failed", e);
    }
}

}
总结通过自定义 ErrorDecoder、配置 Retryer 和 Request.Options,或者手动处理响应,你可以控制 Feign 在遇到 307 状态码时不抛出异常,并进行自定义的逻辑处理。选择哪种方法取决于你的具体需求和应用场景。希望这些信息对你有帮助!如果你有更多具体的问题或需要进一步的帮助,请随时提问。内容由AI生成

标签:Q3,return,feign,Bean,import,new,public
From: https://www.cnblogs.com/chaoshang8/p/18456706

相关文章

  • 界面控件Kendo UI for jQuery 2024 Q3亮点 - 支持切换编辑模式
    随着最新的2024Q3版本,Progress使用户能够使用现成的页面模板和构建块更快地构建令人惊叹的应用程序,使您的Telerik和KendoUI开发体验更好。Telerik和KendoUI 2024Q3版本将焦点放在新推出的页面模板和构建块上,每个页面模板和构建块都预先配置了TelerikUIforBlazor、Kend......
  • 界面控件Kendo UI for jQuery 2024 Q3亮点 - 支持切换编辑模式
    随着最新的2024Q3版本,Progress使用户能够使用现成的页面模板和构建块更快地构建令人惊叹的应用程序,使您的Telerik和KendoUI开发体验更好。Telerik和KendoUI 2024Q3版本将焦点放在新推出的页面模板和构建块上,每个页面模板和构建块都预先配置了TelerikUIforBlazor、KendoU......
  • 基于python数据挖掘技术的线上招聘信息数据可视化分析系统 q3122-- Scrapy爬虫
    目录项目介绍实现功能截图技术栈Scrapy爬虫框架关键技术和使用的工具环境等的说明解决的思路开发流程爬虫核心代码展示系统设计论文书写大纲详细视频演示源码获取项目介绍基于数据挖掘技术的线上招聘信息分析系统旨在通过应用先进的数据分析方法,为求职者和招聘者提......
  • 界面控件Telerik UI for WinForms 2024 Q3概览 - 支持合并单元格等
    TelerikUIforWinForms拥有适用WindowsForms的110多个令人惊叹的UI控件。所有的UIforWinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。本文将介绍界面组件TelerikUIforWinForms在今年第一个重大版本2024......
  • SSM高校学生在线选课系统q399g 系统界面在最后面
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:教师,学生,课程信息,班级信息,选课信息,打分信息,学分信息,必修课程,公告信息开题报告内容课题名称:SSM高校学生在线选课系统一、研究背景与意义随着......
  • LeetCode 408场周赛,Q3. 统计 1 显著的字符串的数量;问题分析
    https://leetcode.cn/contest/weekly-contest-408/problems/count-the-number-of-substrings-with-dominant-ones/description/、、这题难度是middle,但是确实有点强思维的味道,赛时思考了许久,没想到好方向,最后想了个线段树的解法。。当然最后超时了861/884,二十多个用例过不去;......
  • 零基础STM32单片机编程入门(二十) 华邦W25Q32 SPI FLASH实战含源码
    文章目录一.概要二.W25Q32SPIFLASH主要参数三.W25Q32SPIFLASH芯片介绍1.W25Q32芯片内部框图2.W25Q32芯片指令表格3.W25Q32芯片通讯时序四.W25Q32SPIFLASH读写实验五.CubeMX工程源代码下载六.小结一.概要FLASH是一种存储芯片,通过程序可以修改数据,即平时所......
  • Centos7 安装Rabbitmq3.9.11
    安装erlang安装依赖包yum-yinstallgccglibc-develmakencurses-developenssl-develxmltoperlwgetgtk2-develbinutils-devel下载wgethttps://github.com/erlang/otp/releases/download/OTP-24.1.7/otp_src_24.1.7.tar.gz解压tar-zxvfotp_src_24.1.7.tar......
  • Q33 LeetCode18 四数之和
    1.与三数之和类似2.定前两个数,后面使用双指针移动3.注意109需要用long接,int就超出界限了4.while(left<right&&nums[left]==nums[++left]);一个循环去除重复 1classSolution{2publicList<List<Integer>>fourSum(int[]nums,inttarget){3if(nu......
  • Q32 LeetCode15 三数之和
    难点在于不能重复1.将数组进行排序2.找到合适组合后将三个指针都要进行向后去重操作  1classSolution{2publicList<List<Integer>>threeSum(int[]nums){3Arrays.sort(nums);4List<List<Integer>>ans=newArrayList<>();5......