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. 多模态 GPT-V 出世!36 种场景分析 ChatGPT Vision 能力,LMM 将全面替代大语言模型?

    LMM将会全面替代大语言模型?人工智能新里程碑GPT-V美国预先公测,医疗领域/OCR实践+166页GPT-V试用报告首发解读 ChatGPT Vision,亦被广泛称为GPT-V或GPT-4V,代表 ...

  2. vue3.2新增指令v-memo的使用

    v-memo的讲解 vue3.2中新增了一个性能优化的指令: 这个指令就是v-memo; v-memo:可以做性能优化,v-memo中值若不发生变化,整个子树的更新会被跳过. <div v-me ...

  3. 20.4 OpenSSL 套接字AES加密传输

    在读者了解了加密算法的具体使用流程后,那么我们就可以使用这些加密算法对网络中的数据包进行加密处理,加密算法此处我们先采用AES算法,在网络通信中,只需要在发送数据之前对特定字符串进行加密处理,而在接收 ...

  4. centos离线安装mongodb-database-tools

    mongodb-database-tools是MongoDB数据库工具的命令行的工具,用于工作与MongoDB部署.可以使用mongodump和mongoimport很方便的导入导出备份数据. 该数据 ...

  5. 记录开发中element树形控件数据应用在页面上的相关问题

    业务场景 根据后台返回数据生成角色权限的树形结构.获取节点数据后,当父节点被勾选时,所有的子节点全部被勾选,而实际上后台并没有返回当前父节点的所有子节点的ID,所以应该只有部分子节点被勾选. 下面第一 ...

  6. Linux服务器查看端口是否开启或占用

    一.查看端口是否启用 (1)lsof -i :8080 查看8080端口被哪个进程占用 (2)netstat -lnp|grep 8080 查看8080端口被哪个进程占用  (3)ss -nlap | ...

  7. Linux-特殊权限设置(SUID、SGID、SBIT)

    一.SUID权限 1.概念 当s这个标志出现在文件所有者的x权限上时,例如文件权限状态"-rwsr-xr-x",此时就被称为Set UID,简称SUID. 如果该属主权限位上有执行 ...

  8. ABC 305

    题目列表 前三题过水,第四题分类讨论两个端点之间的距离和所在位置是清醒或睡眠 即可. E 题意:一张图上有一些结点有保安,每个保安有不同的警戒度 \(h_i\),定义 一个结点是安全的 为这个结点可以 ...

  9. TCP和UDP面试题提问

    @ 目录 TCP UDP 总结 应用 TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用. TCP TCP 是面向连接的协议,它在数据传输之前需要 ...

  10. 【Unity3D】异步Socket通讯

    1 前言 ​ 同步 Socket 通讯 中的 Accept.Connect.Receive 等方法会阻塞当前线程,当前线程必须等待这些方法执行完,才会继续往下执行,用户需要另开线程执行这些耗时方法,否 ...