.Net HttpClient 处理响应数据
HttpClient 处理响应数据
1、初始化及全局设置
//初始化:必须先执行一次
#!import ./ini.ipynb
2、处理响应状态
//判断响应码:正常
{var response = await SharedClient.GetAsync("api/Normal/GetAccount?id=1");if(response.StatusCode == System.Net.HttpStatusCode.OK){var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"响应码正常:{content}");}
}//判断响应码:非正常
{var response = await SharedClient.GetAsync("api/Normal/GetAccount?id=b");if(response.StatusCode != System.Net.HttpStatusCode.OK){Console.WriteLine($"响应码异常:状态码 {response.StatusCode}");}
}//确保正确响应:正常
{var response = await SharedClient.GetAsync("api/Normal/GetAccount?id=1");//确保异常response.EnsureSuccessStatusCode();var result = await response.Content.ReadFromJsonAsync<BaseResult<Account>>();//result.Display();Console.WriteLine($"响应正常:内容为 {result}");
}//确保正确响应:异常
{try {var response = await SharedClient.GetAsync("api/Normal/GetAccount?id=c");//确保异常response.EnsureSuccessStatusCode();//result.Display();var result = await response.Content.ReadFromJsonAsync<BaseResult<Account>>();Console.WriteLine($"响应正常:内容为 {result}");}catch(Exception e){Console.WriteLine($"请求异常:{e.Message}");}
}//使用 ry catch 捕获所有异常
{try {var result = await SharedClient.GetFromJsonAsync<BaseResult<Account>>("api/Normal/GetAccount?id=a");//result.Display();Console.WriteLine($"响应正常:内容为 {result}");}catch(Exception e){Console.WriteLine($"请求异常:{e.Message}");}finally{//收发业务}
}
3、处理异常响应
3.1 try catch
//try catch 常规异常处理
{try {var response = await SharedClient.GetAsync("api/Normal/GetAccount?id=c");//确保异常response.EnsureSuccessStatusCode();var result = await response.Content.ReadFromJsonAsync<BaseResult<Account>>();Console.WriteLine($"响应正常:内容为 {result}");}catch(Exception e){Console.WriteLine($"接口异常:{e.Message}");}finally{//清理}
}
3.2 管道统一处理
//异常处理管理中间件
public class ExceptionDelegatingHandler : DelegatingHandler
{protected override HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken){Console.WriteLine("ExceptionDelegatingHandler -> Send -> Added Token");HttpResponseMessage response = new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);try {response = base.Send(request, cancellationToken);response.EnsureSuccessStatusCode();}catch(Exception ex){//统一异常处理,当然也可以分类别处理Console.WriteLine($"中间件中,接口调用异常:{ex.Message}");}finally{Console.WriteLine("ExceptionDelegatingHandler -> Send -> After");}return response;}protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){Console.WriteLine("ExceptionDelegatingHandler -> SendAsync -> Before");HttpResponseMessage response = new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);try {response = await base.SendAsync(request, cancellationToken);//可以根据状态码,分别进行处理response.EnsureSuccessStatusCode();}catch(Exception ex){//统一异常处理,当然也可以分类别处理//可以重试等操作Console.WriteLine($"中间件中,接口调用异常:{ex.Message}");}finally{Console.WriteLine("ExceptionDelegatingHandler -> Send -> After");}return response;}
}//使用异常管道,发送请求
{//使用管道中间件,统一处理ExceptionDelegatingHandler exceptionHandler = new ExceptionDelegatingHandler(){InnerHandler = new SocketsHttpHandler()};HttpClient clientWithExceptionHandler = new HttpClient(exceptionHandler){BaseAddress = new Uri(webApiBaseUrl),};//发送请求var response = await clientWithExceptionHandler.GetAsync("api/Normal/GetAccount?id=c");if(response.StatusCode == System.Net.HttpStatusCode.OK){var result = await response.Content.ReadFromJsonAsync<BaseResult<Account>>();Console.WriteLine($"响应正常:内容为 {result}");}else{Console.WriteLine($"接口异常:状态码 {response.StatusCode}");}
}
3.3 类型化客户端统一处理
//类型化客户端
public class HelloApiService
{public HttpClient Client { get; set; }public HelloApiService(HttpClient httpClient){Client = httpClient;}//处理异常:也可以结合AOP,进行统一拦截处理public async Task<string> Ping(){try {var content = await Client.GetStringAsync("/api/Hello/Ping2");return content;}catch(Exception ex){return $"远程调用异常:{ex.Message}";}}
}//使用
{//注册类型化客户端var services = new ServiceCollection();services.AddHttpClient<HelloApiService>(client => {client.BaseAddress = new Uri(webApiBaseUrl);}).ConfigureHttpClient(client=>{client.Timeout = TimeSpan.FromSeconds(1);});//使用类型化客户端,进行远程调用var apiService = services.BuildServiceProvider().GetService<HelloApiService>();var s = await apiService.Ping();Console.WriteLine(s);
}
3.4 Polly库(重试、降级、熔断等,可结合类型化客户端和工厂模式)
//Polly进行异常处理
var services = new ServiceCollection();
services.AddHttpClient(string.Empty)//配置默认命名客户端.ConfigureHttpClient(client => {client.BaseAddress = new Uri(webApiBaseUrl);})//设置Policy错误处理快捷扩展方法.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]{TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(2),TimeSpan.FromSeconds(4),}))//可以多次调用:设置多个策略.AddTransientHttpErrorPolicy(builder => builder.RetryAsync(1));var factory = services.BuildServiceProvider().GetService<IHttpClientFactory>();
var content = await factory.CreateClient().GetStringAsync("/api/polly8/RandomException");
Console.WriteLine($"响应内容:{content}");
4、处理响应数据
4.1 接收响应头数据
//响应头信息
{var response = await SharedClient.GetAsync("api/Normal/GetAccount?id=1");Console.WriteLine("响应头:");foreach(var header in response.Headers){var headerValues = string.Join(",", header.Value);Console.WriteLine($"{header.Key} = {headerValues}");}
}
4.2 接收响应体数据
//响应体数据(json为例)
{var response = await SharedClient.GetAsync("api/Normal/GetAccount?id=1");//获取响应体内容var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"响应体数据:{content}");
}
相关文章:
.Net HttpClient 处理响应数据
HttpClient 处理响应数据 1、初始化及全局设置 //初始化:必须先执行一次 #!import ./ini.ipynb2、处理响应状态 //判断响应码:正常 {var response await SharedClient.GetAsync("api/Normal/GetAccount?id1");if(response.StatusCode Sy…...
【心海资源】【最新话费盗u】【未测】提币对方官方波场+没有任何加密+无后门+前端VUE
提笔接口请使用官方提笔,第三方提笔都有风险 后门你们也扫扫,这种源码风险大,自己玩玩学习进行了 重要的事情说三遍 !!!!!!!!!&…...
Python中的标识、相等性与别名:深入理解对象引用机制
在Python编程中,理解变量如何引用对象以及对象之间的比较方式是至关重要的基础概念。本文将通过Lewis Carroll的笔名示例,深入探讨Python中的对象标识、相等性判断以及别名机制。 别名现象:变量共享同一对象 >>> charles {name: …...
Java 1.8(也称为Java 8)
Java 1.8(也称为Java 8)是Oracle于2014年发布的一个重要版本,引入了许多新特性和改进,极大地提升了Java语言的表达力和开发效率。以下是Java 1.8的主要新特性: ### 1. Lambda表达式 Lambda表达式是Java 1.8最具革命性…...
LVGL简易计算器实战
文章目录 📁 文件结构建议🔹 eval.h 表达式求值头文件🔹 eval.c 表达式求值实现文件(带详细注释)🔹 ui.h 界面头文件🔹 ui.c 界面实现文件🔹 main.c 主函数入口✅ 总结 项目效果&…...
Linux | Uboot-Logo 修改文档(第十七天)
01 Uboot 修改 首先我们在 home 目录下新建一个文件夹 imx6ull,然后打开 i.MX6ULL 终结者光盘资料\05_uboot linux源码,在 window 下解压下图箭头所指的压缩包,解压后分别得到 linux-imx-rel_imx_4.1.15_2.1.0_ga_20200323.tar.gz 和 uboot-imx-rel_imx_4.1.15_2.1.0_…...
数字孪生概念
数字孪生(Digital Twin) 是指通过数字技术对物理实体(如设备、系统、流程或环境)进行高保真建模和实时动态映射,实现虚实交互、仿真预测和优化决策的技术体系。它是工业4.0、智慧城市和数字化转型的核心技术之一。 1. …...
c++STL-string的使用
这里写自定义目录标题 string的使用string写成类模板的原因string的版本举例构造、析构函数和赋值重载构造函数和析构函数operator Iterators迭代器begin和endrbegin和rendcbegin和cend,crbegin和crend(c11) capacity容量有关函数不同编译器下…...
总结C/C++中程序内存区域划分
C/C程序内存分配的⼏个区域 1..栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,…...
C# 方法(方法重载)
本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 方法重载 一个类中可以有多个…...
Dockerfile 完全指南:从入门到最佳实践
Dockerfile 完全指南:从入门到最佳实践 1. Dockerfile 简介与作用 Dockerfile 是一个文本文件,包含了一系列用于构建 Docker 镜像的指令。它允许开发者通过简单的指令定义镜像的构建过程,实现自动化、可重复的镜像构建。 主要作用…...
DEEPPOLAR:通过深度学习发明非线性大核极坐标码(2)
目录 2.问题的提出和背景 2.1 信道编码 2.2.极化码 极坐标编码 极坐标解码 原文:《DEEPPOLAR: Inventing Nonlinear Large-Kernel Polar Codes via Deep Learning》 2.问题的提出和背景 2.1 信道编码 信道编码是一种为传输添加冗余的技术,使其对…...
ESP32-S3 学习笔记(1)
ESP32-S3 学习笔记(1) 背景环境添加工程文件材料准备轻触开关的正负极 背景 闲来无事,看到立创论坛上有许多大佬开源的项目,甚是厉害,于是决定自己也来搞一搞,同时可以做一些技术积累,看了很…...
Python Cookbook-7.9 访问 MySQL 数据库
任务 想访问一个 MySQL 数据库。 解决方案 MySQLdb 模块正是为这种任务而设计的: import MySQLdb #创建一个连接对象,再用它创建游标 con = MySQLdb.connect(host = "127.0.0.1", port = 3306, user = "joe",<...
docker安装superset实践
1、拉取docker镜像 docker pull apache/superset:latest 2、安装superset容器 mkdir /usr/local/develop/docker/superset/ -p touch /usr/local/develop/docker/superset/superset_config.py superset_config.py配置文件如下: SQLALCHEMY_DATABASE_URI mysql:…...
Web开发—Vue工程化
文章目录 前言 Vue工程化 一、介绍 二、环境准备 1.介绍create-vue 2.NodeJS安装 3.npm介绍 三,Vue项目创建 四,项目结构 五,启动项目 六,Vue项目开发流程 七,API风格 前言 Vue工程化 前面我们在介绍Vue的时候&#…...
什么是硬件中断请求号?什么是中断向量号?
一、硬件中断请求号(IRQ,Interrupt Request Number) 定义: 硬件中断请求号(IRQ)是硬件设备向CPU发送中断请求时使用的唯一标识符,用于区分不同的中断源。例如,键盘、硬盘等外设…...
[Java实战]Spring Boot 定时任务(十五)
[Java实战]Spring Boot 定时任务(十五) 一、定时任务的应用场景 数据同步:每日凌晨同步第三方数据状态检查:每5分钟扫描订单超时未支付资源清理:每小时清理临时文件报表生成:每月1号生成财务统计报表通知…...
OpenWrt开发第7篇:OpenWrt配置支持Web界面
文/指尖动听知识库-谷谷 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:Openwrt开发-基于Raspberry Pi 4B开发板 OpenWrt的luci是一个基于Web的图形化管理界面,为用户提供了直观的操作方式,无需命令行即可完成大部分功能的配置。 1.在终端输入ma…...
【多模态】IMAGEBIND论文阅读
every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 IMAGEBIND 多模态论文梗概 IMAGEBIND是一种夸模态的神经网络,以图片为中心,联合六中模态的网络(图片、文…...
【C语言干货】二维数组传参本质
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、二维数组的内存布局 1.二维数组的实质2.二维数组的地址关系 二、二维数组传参的本质 1.参数传递的退化机制2.三种等效的函数声明方式 总结 前言 提示&#…...
基于SpringBoot的抽奖系统测试报告
一、编写目的 本报告为抽奖系统测试报告,本项目可用于团体抽奖活动,包括了用户注册,用户登录,修改奖项以及抽奖等功能。 二、项目背景 抽奖系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据&…...
Go语言从零构建SQL数据库(9)-数据库优化器的双剑客
数据库优化器的双剑客:谓词下推与列裁剪 在数据库查询优化的世界里,有两位特别重要的"超级英雄":谓词下推和列裁剪。这两种优化技术虽然简单,却能带来惊人的性能提升。今天,我们就来揭开它们的神秘面纱&…...
C++中什么是函数指针?
在C中,函数指针是一个指向函数的指针变量。通过函数指针,我们可以像使用函数一样调用它所指向的函数,常用于实现回调函数、函数指针数组等功能。 以下是一个简单的C代码示例,展示了函数指针的使用: cpp #include <…...
Python工具链UV整合环境管理
Python工具链UV整合环境管理 终极Python工具链UV:从依赖管理到项目开发的全维度解析一、引言:重新定义Python开发的大一统时代二、深度安装指南:多场景适配方案1. 官方独立安装器(推荐方案)2. 进阶安装方式3. 安装验证…...
RuoYi-v4.7.8 jar/war部署
准备条件 jdk-8u73-windows-x64.exe mysql5.7 apache-tomcat-9.0.60 apache-maven-3.8.1 RuoYi-v4.7.8.zip (官网 RuoYi) 登录gitee,选择标签要下载的版本好,点击克隆下载zip压缩文件 安装maven Apache Archive Distribution Directory…...
基于SpringBoot的小区停车位管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
张量并行优质博客
必读图解系列1 比较全面的相关文献总结博客,可以重点看一下其中的行列切分算子2 # 图解大模型训练之:张量模型并行(TP),Megatron-LM ↩︎ # 大规模分布式 AI 模型训练系列——张量并行 ↩︎...
汽车诊断简介
历史 20世纪80年代,由于美国西海岸严重的雾霾问题,CARB(加州空气资源委员会)通过了一项法律,要求对机动车辆进行车载监测诊断。这推动了OBD-I的引入,并在1990年代被OBD II取代。与此同时,欧洲也…...
suricata之规则去重
一、环境和背景 1.1 环境 OS: Ubuntu 22.04.5 LTS IDE: vscode suricata: suricata 7.0.5 1.2 背景 在添加规则时,为了给规则分类,将不同类别的规则写入不同的文件。 在规则加载时两条不同的规则却被认为是重复的,因此记录一下去重逻辑。…...
接口在函数参数和对象类型中的应用
在 TypeScript 中,接口(interface)是一种强大的工具,用于定义和约束对象的结构。它不仅可以用于描述对象类型,还能够用于定义函数的参数和返回类型。接口可以提高代码的可读性、可维护性,并帮助捕捉潜在的错…...
Javascript:数组和函数
数组 创建数组 使用new创建 let arrnew array(数组大小); 直接赋值创建 let Arr2[];let Arr3[1,A,"HELLLO"]; 这里JS的数组里面的元素属性可以各不相同 演示代码 <script>let Arr1new Array(5);let Arr2[];let Arr3[1,A,"HELLLO"];console.…...
Vue Router
Vue Router:前端路由跳转的魔法 什么是Vue Router Vue Router是Vue官方的路由管理器,它允许我们在不重新加载页面的情况下更改浏览器中显示的内容,实现单页应用(SPA)的无缝导航体验。 📊 Vue Router工作流程图 #mermaid-svg-xNtkA0qYMjB0lvUt {font-family:"trebu…...
谷歌与微软的AI战争:搜索、云服务与生态布局
谷歌与微软的AI战争:搜索、云服务与生态布局 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 谷歌与微软的AI战争:搜索、云服务与生态布局摘要引言技术路线对比1. AI基础设施:算力…...
robomaster机甲大师--电调电机
文章目录 C620电调ID设置速率 电调发送报文电调接收报文cubemx程序初始化发送接收 C620电调 ID设置 速率 1Mbps 电调发送报文 发送的数据为控制电机的输出电流,需要将can数据帧的ID设置为0x200 电调接收报文 机械角度:电机的0到360度映射到0到几千转…...
菜鸟之路day31一一MySQL之多表设计
菜鸟之路day31一一MySQL之多表设计 作者:blue 时间:2025.5.9 文章目录 菜鸟之路day31一一MySQL之多表设计0.概述一.多表设计1.1一对多1.2一对一1.3多对多 0.概述 内容学习自黑马程序员BV1m84y1w7Tb 一.多表设计 1.1一对多 一对多关系实现ÿ…...
害怕和别人发生冲突怎么办? --deepseek
害怕与他人发生冲突是一种常见的心理状态,可能源于对关系破裂、被否定或情绪失控的担忧。但这种恐惧长期存在会影响自我表达和人际关系。以下是分步骤的应对策略,帮助你逐步建立应对冲突的自信: 第一步:理解你的恐惧根源 自我提问…...
Go语言——kratos微服务框架使用
文章目录 一、安装依赖二、创建项目三、初始化项目四、使用git_bash命令终端运行命令五、创建自己的项目1、修改app.proto3、internal/service/app.go4、修改internal/service/service.go文件5、创建internal/biz/content.go文件6、修改internal/biz/biz.go文件7、创建internal…...
无人机飞控算法开发实战:从零到一构建企业级飞控系统
简介 无人机飞控算法是实现稳定飞行和精确控制的核心技术,涉及飞行动力学建模、传感器数据处理、状态估计和控制策略等多个环节。本实战指南将系统讲解四旋翼无人机飞控算法的开发流程,包括飞行动力学模型建立、传感器校准与数据融合、主流控制算法实现(PID、ADRC、EKF)以…...
MiniMind:3块钱成本 + 2小时!训练自己的0.02B的大模型。minimind源码解读、MOE架构
大家好,我是此林。 目录 1. 前言 2. minimind模型源码解读 1. MiniMind Config部分 1.1. 基础参数 1.2. MOE配置 2. MiniMind Model 部分 2.1. MiniMindForCausalLM: 用于语言建模任务 2.2. 主干模型 MiniMindModel 2.3. MiniMindBlock: 模型的基本构建块…...
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
5.LC 零矩阵(中等) 面试题 01.08. 零矩阵 - 力扣(LeetCode) 思想: 法一: 利用两个集合分别储存要清0的行和列索引 另外两种原地优化空间的做法暂时不是目前刷题目标,故不考虑 代码 c: class Solution { public:void setZeroes(vector&l…...
POSIX信号量
目录 一、相关概念回顾 1.信号量 2.多线程使用资源的两种情况 3.P操作和V操作 二、CP && 基于环形队列的生产者消费者模型 1.环形队列的介绍 编辑 2.基于环形队列的生产者消费者模型的默认规则(通过信号量实现规则的成立) 3.相关的结论…...
前端Web开发HTML5+CSS3+移动web(基础-flex)
网页设计套路:从上到下,从整体到局部 1:HTML定义: (1)超文本是点击可以页面来回切换的链接 (2)标记就是标签语言 2:标签的语法 (1&…...
Java 原生异步编程与Spring 异步编程 详解
简介 Java 异步编程是现代高性能应用开发的核心技术之一,它允许程序在执行耗时操作(如网络请求、文件 IO)时不必阻塞主线程,从而提高系统吞吐量和响应性。 异步 vs 同步 同步:任务按顺序执行,后续任务需…...
AUTOSAR图解==>AUTOSAR_TR_HWTestManagementIntegrationGuide
AUTOSAR硬件测试管理集成指南 启动和关闭阶段硬件测试管理的规范与集成 目录 文档概述 1.1 文档范围 1.2 局限性目标与动机 2.1 目标 2.2 动机 2.3 用例约束与假设缩略语与术语相关文档HTMSS AUTOSAR集成方法HTMSS功能描述AUTOSAR架构解决方案 8.1 HTMSS系统架构 8.2 HTMSS启动…...
Day22 Kaggle泰坦尼克号训练实战
作业 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 一、流程 思路概述 数据加载 :读取泰坦尼克号的训练集和测试集。数据预处理 :处理缺失值、对分类变量进行编码、…...
基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构
在当前目标检测领域中,YOLO系列模型因其优异的速度-精度平衡能力而被广泛部署于工业界与科研场景。YOLOv8作为该系列的最新版本,在主干网络与特征金字塔结构上进行了多项优化,进一步提升了其实时性与鲁棒性。然而,其核心组件—SPP…...
[Linux]从零开始的STM32MP157 Busybox根文件系统构建
一、前言 在上一篇教程中,已经教了大家如何使用Buildroot构建根文件系统,并且在最后我们已经完整的构建了一个可以运行的根文件系统。但是,Buildroot的集成度太高了,不利于小白理解根文件系统,所以本次教程,…...
C++ RAII机制
RAII(Resource Acquisition Is Initialization)是一种编程范式,核心思想是:资源的生命周期与对象绑定——对象创建时获取资源,对象销毁时自动释放资源。这种机制通过构造函数和析构函数的配对执行,确保资源…...
spring中的@Value注解详解
一、核心功能与作用 Value是Spring框架中用于动态注入属性值的注解,支持从配置文件、环境变量、SpEL表达式等来源注入数据,实现代码与配置的解耦。 注入类型覆盖广泛 基本类型:字符串、数值(int/double)、布尔值等。 …...