25. 远程请求
                            后端手册
                            
                            
                        
                            远程请求
                            
                            
                        大约 3 分钟
                            
                        约 751 字
                            
                        
                        
                    
                    提示
Admin.NET 提供两种方式访问发送远程请求,IHttpDispatchProxy 代理方式 和 字符串拓展方式。禁止非法爬虫。
代理模式
                            
                            public interface IHttp : IHttpDispatchProxy
{
    // 发送 Get 请求
    [Get("http://admin.net/get")]
    Task<xxx> GetXXXAsync();
    // 发送 Post 请求
    [Post("http://admin.net/post")]
    Task<xxx> PostXXXAsync();
    // 其他请求方式类同
}字符串模式
                            
                            // 发送 Get 请求
using var res = await "http://admin.net/get".GetAsync();
// 发送 Post 请求
using var res = await "http://admin.net/post".PostAsync();
// 其他请求方式类同也推荐学习下 微软自带 HttpClient 类教程 使用 HttpClient 类发出 HTTP 请求
相关信息
同时,也推荐使用 Flurl 组件。 Flurl 是一个现代的、流畅的、异步的、可测试的、可移植的、充满流行语的 URL 构建器和 HTTP 客户端库,非常方便强悍。
远程请求-字符串方式使用举例:IHttpDispatchProxy 代理方式使用与此类似
1、请求方式
await "http://admin.net/post".SetHttpMethod(HttpMethod.Get);2、地址模板(区分大小写)
await "http://admin.net/post/{id}?name={name}".SetTemplates(new {
    id = 1,
    name = "Admin.NET"
});3、请求报文头
await "http://admin.net/post".SetHeaders(new {
    Authorization = "Bearer 你的token"
});4、URL 地址参数
await "http://admin.net/get".SetQueries(new {
    id = 1,
    name = "Admin.NET"
});5、URL 请求客户端
await "http://admin.net".SetClient(() => new HttpClient());6、Body 参数
await "http://admin.net/api/user/add".SetBody(new { Id = 1, Name = "Admin.NET" }, "application/json");注意
若请求 Content-Type 设置为 application/x-www-form-urlencoded 类型,那么框架底层自动将数据进行 UrlEncode 编码处理,无需外部处理。
7、Content-Type
await "http://admin.net/post".SetContentType("application/json");8、内容编码
await "http://admin.net/post".SetContentEncoding(Encoding.UTF8);9、JSON 序列化
await "http://admin.net/post".SetJsonSerialization<NewtonsoftJsonSerializerProvider>(new JsonSerializerSettings {
});10、Body 参数验证
await "http://admin.net/post".SetValidationState(includeNull: true); // 支持类中 [Required] 等完整模型验证特性11、请求拦截
await "http://admin.net/".OnRequesting((client, req) => {
    req.AppendQueries(new Dictionary<string, object> {
        { "token", "xxxx"}
    });
});12、HttpClient 拦截
await "http://admin.net/".OnClientCreating(client => {
    client.Timeout = TimeSpan.FromSeconds(30); // 超时
});13、请求之前拦截
await "http://admin.net/".OnRequesting((client, req) => {
});14、请求结果拦截
await "http://admin.net/".OnResponsing((client, req) => {
});15、请求异常拦截
await "http://admin.net/".OnException((client, res, errors) => {
  
});16、文件上传
// 支持多个文件、支持bytes、fileStream格式,bytes 可通过 File.ReadAllBytes (文件路径) 获取
var res = await "http://admin.net//upload".SetContentType("multipart/form-data")
    .SetFiles(("key", bytes, "fileName")).PostAsync();相关信息
若遇到微信上传出现问题,则可设置 Content-Type 为:application/octet-stream。
17、重试策略
var res = await "http://admin.net".SetRetryPolicy(5, 1000).GetAsync(); // 若请求失败则则重试 5 次,每次间隔 1s18、GZip 压缩
var res = await "http://admin.net".WithGZip().GetAsync();19、Url 转码
var res = await "http://admin.net".WithEncodeUrl(false).GetAsync();20、HTTP 版本
var res = await "http://admin.net".SetHttpVersion("2.0").GetAsync(); // 处理 HTTP 和 HTTPS 请求异常21、下载文件
await "http://admin.net/logo.png".GetToSaveAsync("D:/1.png");22、设置 Cookies
await "http://admin.net/post"
    .OnRequesting((client, request) =>
    {
        var cookieContainer = new CookieContainer();
        cookieContainer.Add(request.RequestUri, new Cookie("key", "Admin.NET"));
        request.Headers.Add("Cookie", cookieContainer.GetCookieHeader(request.RequestUri));
    })
    .GetAsync();23、静态方式
await HttpRequestPart.Default().SetRequestUrl("http://admin.net").GetAsStringAsync();24、获取 Cookies
using var response = await "http://admin.net".GetAsync();
var cookies = response.GetCookies();