简单封装 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 ...
随机推荐
- 多模态 GPT-V 出世!36 种场景分析 ChatGPT Vision 能力,LMM 将全面替代大语言模型?
LMM将会全面替代大语言模型?人工智能新里程碑GPT-V美国预先公测,医疗领域/OCR实践+166页GPT-V试用报告首发解读 ChatGPT Vision,亦被广泛称为GPT-V或GPT-4V,代表 ...
- vue3.2新增指令v-memo的使用
v-memo的讲解 vue3.2中新增了一个性能优化的指令: 这个指令就是v-memo; v-memo:可以做性能优化,v-memo中值若不发生变化,整个子树的更新会被跳过. <div v-me ...
- 20.4 OpenSSL 套接字AES加密传输
在读者了解了加密算法的具体使用流程后,那么我们就可以使用这些加密算法对网络中的数据包进行加密处理,加密算法此处我们先采用AES算法,在网络通信中,只需要在发送数据之前对特定字符串进行加密处理,而在接收 ...
- centos离线安装mongodb-database-tools
mongodb-database-tools是MongoDB数据库工具的命令行的工具,用于工作与MongoDB部署.可以使用mongodump和mongoimport很方便的导入导出备份数据. 该数据 ...
- 记录开发中element树形控件数据应用在页面上的相关问题
业务场景 根据后台返回数据生成角色权限的树形结构.获取节点数据后,当父节点被勾选时,所有的子节点全部被勾选,而实际上后台并没有返回当前父节点的所有子节点的ID,所以应该只有部分子节点被勾选. 下面第一 ...
- Linux服务器查看端口是否开启或占用
一.查看端口是否启用 (1)lsof -i :8080 查看8080端口被哪个进程占用 (2)netstat -lnp|grep 8080 查看8080端口被哪个进程占用 (3)ss -nlap | ...
- Linux-特殊权限设置(SUID、SGID、SBIT)
一.SUID权限 1.概念 当s这个标志出现在文件所有者的x权限上时,例如文件权限状态"-rwsr-xr-x",此时就被称为Set UID,简称SUID. 如果该属主权限位上有执行 ...
- ABC 305
题目列表 前三题过水,第四题分类讨论两个端点之间的距离和所在位置是清醒或睡眠 即可. E 题意:一张图上有一些结点有保安,每个保安有不同的警戒度 \(h_i\),定义 一个结点是安全的 为这个结点可以 ...
- TCP和UDP面试题提问
@ 目录 TCP UDP 总结 应用 TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用. TCP TCP 是面向连接的协议,它在数据传输之前需要 ...
- 【Unity3D】异步Socket通讯
1 前言 同步 Socket 通讯 中的 Accept.Connect.Receive 等方法会阻塞当前线程,当前线程必须等待这些方法执行完,才会继续往下执行,用户需要另开线程执行这些耗时方法,否 ...