news 2026/7/23 14:49:43

JNPF 远程请求代理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 调用更加简洁和便捷,提高了开发效率和代码可维护性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 14:49:14

毕业论文问卷收不到数据?2026年四类样本平台回收方案对比实测

前阵子帮社科专业的师妹梳理毕业论文&#xff0c;她卡在问卷数据回收环节。发了半个月社群和朋友圈&#xff0c;有效答卷才九十多份&#xff0c;还几乎都是同校同年龄段的学生&#xff0c;样本代表性严重不足&#xff0c;导师直接要求重新收集数据。这类问题我接触过不少&#…

作者头像 李华
网站建设 2026/7/23 14:46:31

超自动化运维如何提升系统可靠性?

在数字化时代&#xff0c;系统可靠性已经不再是“锦上添花”的加分项&#xff0c;而是企业生存的生命线。一次核心系统的宕机&#xff0c;可能意味着数百万的业务损失、数万用户的信任崩塌、甚至监管机构的问责通报。然而&#xff0c;当系统架构日益复杂——从单体应用到微服务…

作者头像 李华
网站建设 2026/7/23 14:45:18

GPT 5.6 Sol数学证明获专家认可:AI如何突破符号推理瓶颈

那天下午&#xff0c;我正和一位做形式化验证的朋友讨论一个棘手的数学问题。他忽然提到&#xff1a;“你听说了吗&#xff1f;有个叫‘GPT 5.6 Sol’的模型&#xff0c;最近在一个数学证明任务上得到了领域专家的正式认可。” 我第一反应是怀疑——AI生成数学证明不是什么新鲜…

作者头像 李华