19. 远程请求
📝 模块更新日志
-
新特性
- 远程请求
[HttpMethod]ToSaveAsync
下载远程文件并保存到磁盘方法 4.8.7.32 ⏱️2023.04.02 bfd02c1 - 远程请求支持
Content-Type
为text/html
和text/plain
处理 4.8.7.22 ⏱️2023.03.27 #I6QMLR - 远程请求
HttpRequestMessage
拓展方法AppendHeaders
4.8.7.10 ⏱️2023.03.14 #I6MVHT - 远程请求配置
SetHttpVersion(version)
配置,可配置HTTP
请求版本,默认为1.1
4.8.5.8 ⏱️2023.02.06 #I6D64H - 远程请求
[QueryString]
特性添加时间格式化Format
属性 4.8.1.2 ⏱️2022.11.24 !670
- 远程请求
-
问题修复
- 远程请求获取响应
Cookies
被截断问题 4.8.8.54 ⏱️2023.11.08 #I8EV1Z - 远程请求上传文件在其他编程语言获取文件名存在双引号问题 4.8.8.53 ⏱️2023.11.07 #I8EF1S
- 远程请求在被请求端返回非
200
状态码但实际请求已处理也抛异常问题 4.8.8.14 ⏱️2023.05.12 b14a51f - 远程请求
Body
参数为粘土对象Clay
类型序列化有误 4.8.8.1 ⏱️2023.04.18 #I6WKRZ - 远程请求获取
Cookies
时如果包含相同Key
异常问题 4.8.7.44 ⏱️2023.04.12 #I6V3T7 - 远程请求代理模式配置了
WithEncodeUrl = false
无效问题 4.8.6.4 ⏱️2023.02.16 89639ba - 由于 #I6D64H 导致远程请求出现
Specified method is not supported.
问题 4.8.5.9 ⏱️2023.02.07 #I6DEEE #I6D64H -
优化远程请求ReadAsStringAsync
底层方法,尝试修复Error while copying content to a stream.
错误 4.8.5.8 ⏱️2023.02.06 #I6D64H - 远程请求配置
WithEncodeUrl(false)
对application/x-www-form-urlencoded
请求类型无效 4.8.4 ⏱️2022.12.30 #I682DX
- 远程请求获取响应
-
其他更改
- 取消远程请求
GET/HEAD
不能传递Body
的限制 4.8.8.39 ⏱️2023.08.02 8113460
- 取消远程请求
-
文档
- 远程请求
[QueryString]
配置时间类型Format
格式化文档 4.8.1.2 ⏱️2022.11.25 !673
- 远程请求
版本说明
以下内容仅限 Furion 1.16.0 +
版本使用。
19.1 关于远程请求
在互联网大数据的驱动下,平台或系统免不了需要和第三方进行数据交互,而第三方往往提供了 RESTful API
接口规范,这个时候就需要通过 Http
请求第三方接口进行数据传输交互。
也就是本章节所说的远程请求。
19.2 远程请求的作用
- 跨系统、跨设备通信
- 实现多个系统数据传输交互
- 跨编程语言协同开发
19.3 基础使用
19.3.1 注册服务
使用之前需在 Startup.cs
注册 远程请求服务
public void ConfigureServices(IServiceCollection services)
{
services.AddRemoteRequest();
}
19.3.2 使用方式
Furion
提供两种方式访问发送远程请求。
- IHttpDispatchProxy 代理方式
- 字符串拓展方式
定义代理请求的 接口
并继承 IHttpDispatchProxy
接口
public interface IHttp : IHttpDispatchProxy
{
[Get("http://furion.baiqian.ltd/get")]
Task<Result> GetXXXAsync();
[Post("http://furion.baiqian.ltd/post")]
Task<Result> PostXXXAsync();
[Put("http://furion.baiqian.ltd/put")]
Task<Result> PutXXXAsync();
[Delete("http://furion.baiqian.ltd/delete")]
Task<Result> DeleteXXXAsync();
[Patch("http://furion.baiqian.ltd/patch")]
Task<Result> PatchXXXAsync();
[Head("http://furion.baiqian.ltd/head")]
Task<Result> HeadXXXAsync();
}
通过构造函数注入 接口
using Furion.DynamicApiController;
using Furion.RemoteRequest.Extensions;
namespace Furion.Application
{
public class RemoteRequestService : IDynamicApiController
{
private readonly IHttp _http;
public RemoteRequestService(IHttp http)
{
_http = http;
}
public async Task GetData()
{
var data = await _http.GetXXXAsync();
}
}
}
var response = await "http://furion.baiqian.ltd/get".GetAsync();
var response = await "http://furion.baiqian.ltd/post".PostAsync();
var response = await "http://furion.baiqian.ltd/put".PutAsync();
var response = await "http://furion.baiqian.ltd/delete".DeleteAsync();
var response = await "http://furion.baiqian.ltd/patch".PatchAsync();
var response = await "http://furion.baiqian.ltd/head".HeadAsync();
需引入 using Furion.RemoteRequest.Extensions
命名空间。
19.4 字符串方式使用示例
温馨提示
推荐使用 《19.5 代理方式》代替本小节功能。代理方式
能够提供更容易且更易维护的方式。