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

JNPF 远程请求代理

远程请求代理

一、核心功能

远程请求代理是 JNPF 框架提供的 HTTP 请求封装系统,支持通过接口定义远程 API 调用,无需手动编写 HTTP 请求代码。

1.1 核心价值

  • 接口化定义:通过接口定义远程 API,自动生成 HTTP 请求代码
  • 依赖注入:支持通过 DI 容器注入远程服务接口
  • 拦截器支持:支持请求和响应拦截器,实现统一的请求处理
  • 重试机制:支持请求重试,提高系统可靠性
  • 配置灵活:支持多种配置方式,满足不同场景需求

二、实现原理

2.1 接口定义

通过定义接口和特性标记远程 API:

[Client("https://api.example.com")]publicinterfaceIUserApi{[Get("/users/{id}")]Task<UserInfo>GetUserInfo(stringid);[Post("/users")]Task<UserInfo>CreateUser([Body]UserInfouser);[Put("/users/{id}")]Task<UserInfo>UpdateUser(stringid,[Body]UserInfouser);[Delete("/users/{id}")]TaskDeleteUser(stringid);}

2.2 动态代理

框架使用DispatchProxy动态生成接口实现:

publicclassHttpDispatchProxy:DispatchProxy,IHttpDispatchProxy{publicIEventPublisherEventPublisher{get;set;}protectedoverrideobjectInvoke(MethodInfotargetMethod,object[]args){// 解析接口方法和参数varhttpMethod=targetMethod.GetCustomAttribute<HttpMethodBaseAttribute>();varpath=httpMethod.Path;varbody=args.FirstOrDefault(a=>a?.GetType().GetCustomAttribute<BodyAttribute>()!=null);// 构建 HTTP 请求varrequest=newHttpRequestMessage(httpMethod.HttpMethod,path);request.Content=newJsonContent(body);// 发送请求varresponse=_httpClient.SendAsync(request).Result;// 解析响应returnresponse.Content.ReadFromJsonAsync(targetMethod.ReturnType.GenericTypeArguments[0]).Result;}}

2.3 请求构建

框架自动构建 HTTP 请求:

┌─────────────────────────────────────────────────────────────┐ │ 请求构建流程 │ ├─────────────────────────────────────────────────────────────┤ │ 1. 解析接口方法 │ │ └── 获取 HTTP 方法和路径 │ ├─────────────────────────────────────────────────────────────┤ │ 2. 解析参数 │ │ ├── 路由参数({id}) │ │ ├── 查询参数(QueryString) │ │ ├── 请求体参数(Body) │ │ └── 请求头参数(Headers) │ ├─────────────────────────────────────────────────────────────┤ │ 3. 构建 HttpRequestMessage │ │ └── 设置 HTTP 方法、URL、内容、头信息 │ ├─────────────────────────────────────────────────────────────┤ │ 4. 发送请求 │ │ └── 使用 HttpClient 发送请求 │ ├─────────────────────────────────────────────────────────────┤ │ 5. 解析响应 │ │ └── 将响应内容反序列化为返回类型 │ └─────────────────────────────────────────────────────────────┘

三、使用示例

3.1 定义远程 API 接口

[Client("https://api.example.com")]publicinterfaceIUserApi{[Get("/users")]Task<List<UserInfo>>GetUserList([QueryString]intpageIndex=1,[QueryString]intpageSize=10);[Get("/users/{id}")]Task<UserInfo>GetUserInfo(stringid);[Post("/users")]Task<UserInfo>CreateUser([Body]UserInfoInputuser);[Put("/users/{id}")]Task<UserInfo>UpdateUser(stringid,[Body]UserInfoInputuser);[Delete("/users/{id}")]TaskDeleteUser(stringid);[Get("/users/search")]Task<List<UserInfo>>SearchUsers([QueryString]stringkeyword);}

3.2 注册远程服务

Startup.cs中注册:

services.AddRemoteRequest();services.AddHttpClient<IUserApi>();

3.3 注入并使用

publicclassUserService{privatereadonlyIUserApi_userApi;publicUserService(IUserApiuserApi){_userApi=userApi;}publicasyncTask<UserInfo>GetUserInfo(stringuserId){returnawait_userApi.GetUserInfo(userId);}publicasyncTask<UserInfo>CreateUser(UserInfoInputuser){returnawait_userApi.CreateUser(user);}}

四、特性说明

4.1 HTTP 方法特性

特性HTTP 方法说明
[Get]GET获取资源
[Post]POST创建资源
[Put]PUT更新资源
[Delete]DELETE删除资源
[Patch]PATCH部分更新资源
[Head]HEAD获取资源头信息

4.2 参数特性

特性说明
[Body]请求体参数,序列化为 JSON
[QueryString]查询字符串参数
[Headers]请求头参数
[FormField]表单字段参数

4.3 类级别特性

特性说明
[Client]指定基础地址
[Headers]指定默认请求头
[Interceptor]指定拦截器类型

五、配置选项

5.1 客户端配置

appsettings.json中配置:

{"RemoteRequestSettings":{"Clients":{"IUserApi":{"BaseAddress":"https://api.example.com","Timeout":"00:01:00","Headers":{"Accept":"application/json","Authorization":"Bearer token"}}}}}

5.2 客户端配置项

配置项默认值说明
BaseAddressnull基础地址
Timeout00:01:00请求超时时间
Headers{}默认请求头
RetryCount0重试次数
RetryTimeout00:00:01重试间隔

5.3 服务注册配置

services.AddRemoteRequest(options=>{options.Timeout=TimeSpan.FromSeconds(30);options.RetryCount=3;options.RetryTimeout=TimeSpan.FromSeconds(5);});

六、高级特性

6.1 拦截器

实现IHttpInterceptor接口自定义拦截器:

publicclassAuthInterceptor:IHttpInterceptor{publicTaskOnRequestAsync(HttpRequestMessagerequest){// 在请求发送前添加认证头request.Headers.Authorization=newAuthenticationHeaderValue("Bearer","token");returnTask.CompletedTask;}publicTaskOnResponseAsync(HttpResponseMessageresponse){// 在响应返回后处理if(!response.IsSuccessStatusCode){thrownewException("请求失败");}returnTask.CompletedTask;}}

注册拦截器:

[Interceptor(typeof(AuthInterceptor))][Client("https://api.example.com")]publicinterfaceIUserApi{}

6.2 重试机制

使用[RetryPolicy]特性配置重试策略:

[RetryPolicy(Count=3,Timeout=5000)][Client("https://api.example.com")]publicinterfaceIUserApi{}

6.3 异步请求

接口方法默认异步执行:

publicinterfaceIUserApi{[Get("/users/{id}")]Task<UserInfo>GetUserInfo(stringid);}

6.4 同步请求

也支持同步请求:

publicinterfaceIUserApi{[Get("/users/{id}")]UserInfoGetUserInfo(stringid);}

6.5 文件上传

支持文件上传:

publicinterfaceIFileApi{[Post("/upload")]Task<UploadResult>UploadFile([FormField]stringfileName,[FormField]HttpFilefile);}

6.6 批量请求

支持批量请求:

publicinterfaceIBatchApi{[Post("/batch")]Task<List<BatchResult>>BatchRequest([Body]List<BatchItem>items);}

6.7 请求日志

框架自动记录请求日志:

services.AddRemoteRequest(options=>{options.LogEnabled=true;});

七、核心文件

文件说明
HttpDispatchProxy.csHTTP 动态代理实现
IHttpDispatchProxy.csHTTP 动态代理接口
Http.csHTTP 请求入口类
HttpRequestPart.csHTTP 请求部分
HttpRequestPartMethods.csHTTP 请求方法
HttpRequestPartSetters.csHTTP 请求设置器
HttpResponseModel.csHTTP 响应模型
RemoteRequestServiceCollectionExtensions.cs远程请求服务扩展方法
GetAttribute.csGET 请求特性
PostAttribute.csPOST 请求特性
PutAttribute.csPUT 请求特性
DeleteAttribute.csDELETE 请求特性
BodyAttribute.cs请求体参数特性
QueryStringAttribute.cs查询字符串参数特性
ClientAttribute.cs客户端特性
InterceptorAttribute.cs拦截器特性
RetryPolicyAttribute.cs重试策略特性

八、总结

远程请求代理通过接口化定义和动态代理技术,实现了简洁的远程 API 调用方式。核心设计思想:

  1. 接口化定义:通过接口定义远程 API,自动生成 HTTP 请求代码
  2. 动态代理:使用DispatchProxy动态生成接口实现,无需手动编写请求代码
  3. 依赖注入:支持通过 DI 容器注入远程服务接口
  4. 拦截器支持:支持请求和响应拦截器,实现统一的请求处理
  5. 重试机制:支持请求重试,提高系统可靠性

这种设计使得远程 API 调用更加简洁和便捷,提高了开发效率和代码可维护性。

http://www.jsqmd.com/news/1248403/

相关文章:

  • 2026年专业学位论文AI检测达标指南:专业学位论文AIGC超标4.8元完整处理方案
  • 2026年漯河家装难点盘点易杨装饰全案深度解析推荐 - 装企自媒体训练营辉哥
  • Unity Addressable异步加载实战:告别回调地狱,掌握三种高效写法
  • 佛山无衬纸铝箔胶带工厂怎么选:参数核验与源头工厂识别指南 - 资讯在线
  • Python毕设选题推荐:基于 Python 的计算机辅助数学教学学习系统设计 线上数学练习、模拟考试与答疑系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2026升级之选那曲隐形扣费再见!奢侈品回收新规重拳出击,这些持证门店全程公开透明 - 谊识预商贸
  • AI教材写作:低查重率生成方案与实践
  • AI能自动生成证书吗?AI时代的SSL证书行业会怎么变?
  • 计算机指令与机器码转换原理及实战解析
  • 西安帝舵售后服务体系全解析|官网认证地址及电话全新启用(2026年7月最新) - 帝舵官方售后服务中心
  • 2026年佛山瓷砖批发优选:大三元陶瓷引领新风尚 - GrowUME
  • 2026年北京卡地亚售后服务网络更新优化 全国60+门店地址及电话汇总 - 卡地亚中国服务中心
  • Claude Code与飞书协作平台的无缝整合方案
  • 制造业文件管理怎么做?2026企业网盘远程协同方案对比
  • 从选择机构到拿到土耳其护照:一条真实的基金移民之路 - GrowUME
  • 从智能感知到高效驱动,安森美以系统方案加速机器人落地
  • 北京梵克雅宝首饰回收怎么选|2026行业甄选清单与新手变现避坑攻略 - 全国二奢机构参考
  • Python毕设选题推荐:基于协同过滤的影视资源推荐服务系统 基于 Python 的电影评分数据分析与智能推荐平台【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2026上新阳泉二手手表包包奢侈品持续走高?首批认证回收优选平台发布,推荐门店守护市民变现权益 - 谊识预商务
  • 智算中心供电方案深度解析:从架构演进到关键产品选型
  • 036、YOLOv8改进实战:DynamicConv动态卷积原理与C2f_DynamicConv模块代码实现
  • 《寻梦丝路》2026年7月最新官方下载:重走千年商道,续写丝路传奇
  • 2026东莞高空车租赁 叉车租赁 吊车租赁就近调车实测 - LYL仔仔
  • Meta战略转型:AI算力租赁如何重塑行业格局
  • 2026年期刊审稿AI检测达标指南:期刊投稿论文AIGC率超标4.8元完整处理方案
  • 武汉黄金回收上门靠谱吗?本地上门回收避坑与正规标准指南 - 奢侈品回收评测
  • TI TLV320AIC音频Codec实战:AGC、DRC与蜂鸣器配置详解
  • Palantir Ontology: The Architecture That Turns AI Agents Into Decision-Making Systems——将AI智能体转化为决策系统
  • 2026苍南县真空断路器厂家哪家好,一二次融合真空断路器厂家推荐:采购避坑指南与源头厂选品攻略 - GEO99
  • 知识蒸馏降本复盘:用 70B 教师模型训练 7B 学生模型的全流程