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的更多相关文章

  1. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  2. FMDB简单封装和使用

    工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...

  3. Android--Retrofit+RxJava的简单封装(三)

    1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...

  4. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...

  5. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  6. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  7. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

  8. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  9. ADO简单封装(MFC)

    简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...

  10. MySQL的C++简单封装

    /* *介绍:MySQL的简单封装,支持流操作输入输出MySQL语句,然而并没有什么软用,大二学生自娱自乐,有不足求指点 *作者:MrEO *日期:2016.3.26 */ 头文件 my_sql.h ...

随机推荐

  1. Istio安装和部署

    Istio的版本对k8s的版本是有要求的,不兼容的版本会引发一些隐蔽的错误,安装前先参考下图 版本 目前支持 发行日期 停止维护 支持的 Kubernetes 版本 未测试,可能支持的 Kuberne ...

  2. 【一个构想】pull方式获取expoter上的数据,如何更加精简?

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 背景 已知:在prometheus中,每个业务节点通过prometheu ...

  3. word 常用设置

    目录 目录 关闭 Word 句首字母自动大写功能 1 Word 生成目录 1 Word 快速调整标题级别 1 Word 关闭句首字母自动大写功能 参考:https://zhuanlan.zhihu.c ...

  4. 领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统

    领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统 本项目主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系.疾病自诊主要通 ...

  5. Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析

    Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析 1.角色扮演 行为 Prompt写法 "牙医" ""我想让你 ...

  6. 1.9 动态解密ShellCode反弹

    动态解密执行技术可以对抗杀软的磁盘特征查杀.其原理是将程序代码段中的代码进行加密,然后将加密后的代码回写到原始位置.当程序运行时,将动态解密加密代码,并将解密后的代码回写到原始位置,从而实现内存加载. ...

  7. LyScriptTools 调试控制类API接口手册

    LyScriptTools模块中的DebugControl类主要负责控制x64dbg调试器的行为,例如获取或设置寄存器组,执行单步命令等,此类内的方法也是最常用的. 插件地址:https://gith ...

  8. Docker从认识到实践再到底层原理(三)|Docker在Centos7环境下的安装和配置

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  9. ListView 判断有没有选中的行方法

    ListView1.SelCount 返回选中行的行数 应该是 没有测试 但是测试了 如果没有选中行 返回0 如果选中一行了 返回1

  10. [Ngbatis源码学习] Ngbatis 源码学习之资源加载器 DaoResourceLoader

    Ngbatis 源码学习之资源加载器 DaoResourceLoader DaoResourceLoader 是 Ngbatis 的资源文件加载器,扩展自 MapperResourceLoader.本 ...