当前位置: 首页 > news >正文

.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}"); 
}

相关文章:

  • BGP实验练习1
  • 基于Docker的Bitwarden的私有本地部署
  • 在 Windows 系统上选择与部署 DICOM 医学影像开发工具与库
  • 【计算机视觉】基于深度学习的实时情绪检测系统:emotion-detection项目深度解析
  • C语言文件读写函数详解与示例(fread、fgets、fgetc、fscanf、fwrite、fputs 和 fputc比较)
  • Java学习手册:服务注册与发现
  • Mask-aware Pixel-Shuffle Down-Sampling (MPD) 下采样
  • Java对象的内存分布(二)
  • 数组的常用方法
  • TikTok 互动运营干货:AI 助力提升粘性
  • 理解CNN模型:从原理到应用
  • 程序中的内存从哪里来?
  • 【第三十五周】Janus-pro 技术报告阅读笔记
  • VSCode连接Overleaf失败解决办法
  • GET请求和POST请求的区别
  • 在 C++中,指针数组与数组指针的区别
  • 代码随想录笔记---回溯篇
  • OrangePi Zero 3学习笔记(Android篇)6 - hid-ft260
  • 解决SSH连接华为云服务器ESC经常性断连问题
  • 单链表C语言实现(付代码全)
  • 行知读书会|换一个角度看见社会
  • 《单身情歌》制作人韩贤光去世,林志炫发文悼念
  • 外交部就习近平主席将出席中拉论坛第四届部长级会议开幕式介绍情况
  • 国内大模型人才大战打响!大厂各出奇招
  • 高培勇:中国资本市场的发展应将预期因素全面纳入分析和监测体系
  • 巴西总统卢拉抵达北京