简单封装 Flurl
FlurlHttpClient类
public class FlurlHttpClient
{
private readonly FlurlClient client;
public FlurlHttpClient(FlurlClient client)
{
this.client = client;
client.WithHeader("hteder", "hhhhh");//请求头
}
public async Task<T> GetAsync<T>(string url) where T : class
{
try
{
return await client.Request(url).GetJsonAsync<T>();
}
catch (FlurlHttpException ex)
{
string method = ex.Call.HttpRequestMessage.Method.Method; // 获取请求方式
IFlurlResponse? response = ex.Call.Response;
int? statusCode = response is null ? null : response.StatusCode;//服务器状态码
string errorMsg = $"服务器状态码:{statusCode};Url:{ex.Call.Request.Url};请求方式:{method},入参:无;message:{ex.Message}";
throw new Exception(errorMsg);
}
}
/// <summary>
/// Get请求
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url">url</param>
/// <param name="values">参数以对象的形式传入</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<T> GetAsync<T>(string url, object values)
{
try
{
return await client.Request(url).SetQueryParams(values).GetJsonAsync<T>();
}
catch (FlurlHttpException ex)
{
string method = ex.Call.HttpRequestMessage.Method.Method; // 获取请求方式
IFlurlResponse? response = ex.Call.Response;
string? statusCode = response is null ? null : response.StatusCode.ToString();//服务器状态码
string errorMsg = $"服务器状态码:{statusCode ?? "无"};Url:{ex.Call.Request.Url};请求方式:{method};入参:{values};message:{ex.Message}";
throw new Exception(errorMsg);
}
}
/// <summary>
/// Post请求
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url">url</param>
/// <param name="values">参数以对象的形式传入</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<T> PostAsync<T>(string url,object values)
{
try
{
//.ReceiveJson<T>()方法来指定响应的JSON数据会被反序列化为类型T
return await client.Request(url).PostJsonAsync(values).ReceiveJson<T>();
}
catch (FlurlHttpException ex)
{
string method = ex.Call.HttpRequestMessage.Method.Method; // 获取请求方式
IFlurlResponse? response = ex.Call.Response;
int? statusCode = response is null ? null : response.StatusCode;//服务器状态码
string errorMsg = $"服务器状态码:{statusCode};Url:{ex.Call.Request.Url};请求方式:{method};入参:{values};message:{ex.Message}";
throw new Exception(errorMsg);
}
}
}
注入FlurlHttpClient类
/// <summary>
/// 初始化flurlhttpclient
/// </summary>
/// <param name="builder"></param>
public static void InitFlurlHttpClient(this WebApplicationBuilder builder)
{
var baseUrl = builder.Configuration["wmsBaseUrl"];
if (string.IsNullOrEmpty(baseUrl)) throw new Exception("baseUrl未配置");
//WithHeader添加请求头
builder.Services.AddScoped(provider => new FlurlClient(baseUrl).WithHeader("test","111"));
builder.Services.AddScoped(provider => {
var flurlClient = provider.GetService<FlurlClient>(); // 从依赖注入容器中获取 FlurlClient 类型
if (flurlClient is null) throw new Exception("系统错误flurlClient类还未注入");
return new FlurlHttpClient(flurlClient);
});
}
使用
[HttpGet]
public async Task<ActionResult<ApiResponse>> Get()
{
var resAsync = httpClient.GetAsync<object>("TakeNumber/GetNumber", new { boxNumber = "123456" });
return this.Success(resAsync);
}
[HttpPost]
public async Task<ActionResult<ApiResponse>> Post()
{
var resAsync = httpClient.PostAsync<object>("TakeNumber/GetNumber", new { boxNumber = "123456" });
return this.Success(resAsync);
}
简单封装 Flurl的更多相关文章
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
- FMDB简单封装和使用
工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...
- Android--Retrofit+RxJava的简单封装(三)
1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...
- okhttp3 get post 简单封装
最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- 对pymysql的简单封装
#coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...
- iOS开发——UI篇OC篇&UITableView简单封装
UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...
- iOS sqlite 增删改查 简单封装(基于 FMDB)
/** * 对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * * 基于 FMDB * * 操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...
- ADO简单封装(MFC)
简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...
- MySQL的C++简单封装
/* *介绍:MySQL的简单封装,支持流操作输入输出MySQL语句,然而并没有什么软用,大二学生自娱自乐,有不足求指点 *作者:MrEO *日期:2016.3.26 */ 头文件 my_sql.h ...
随机推荐
- ABP Vnext 微服务 常见问题
1.token问题 原因:拿token和认证token的服务器不一致 2.minio访问报错 minio错误 S3 API Request made to Console port. S3 R 解决方 ...
- NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践
NLP文本匹配任务Text Matching [无监督训练]:SimCSE.ESimCSE.DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度,该示例会基于 ESimCSE 实现一个无监 ...
- 强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战
强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法.双延迟深度确定性策略梯度TD3算法详解项目实战 1.定义算法 1.1 定义模型 !pip uninstall -y par ...
- 深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型、LEO模型、Reptile模型
深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型.LEO模型.Reptile模型 1.Model-Agnostic Meta-Learning Model-Agnostic Meta-L ...
- [vue] 脚手架笔记
笔记 脚手架文件结构 ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── a ...
- Kafka-如何重设消费者位移(重设OFFSET)
1. 为什么要重设消费者组位移? 我们知道,Kafka 和传统的消息引擎在设计上是有很大区别的,其中一个比较显著的区别就是,Kafka 的消费者读取消息是可以重演的(replayable). 像 Ra ...
- [JVM]GC日志解读解析
GC日志解读解析 示例代码 package jvm.test1; import java.util.Random; import java.util.concurrent.TimeUnit; impo ...
- 探索C语言的内存魔法:动态内存管理解析
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 静态开辟内存 通过前面的学习,我们已经掌握了两种开辟内存的方法,分别是: #incl ...
- 使用python进行视频图片提取
操作系统 : Windows 10 [版本 10.0.19043.1165] Python 版本 : 3.9.2_x64 可以借助python代码使用opencv实现,命令行示例代码如下: # pyt ...
- Python中Try/Except/else/final语句
python中的try/except/else/finally语句 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错误(pyt ...